일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- git
- merge
- 중급파이썬
- Vue
- EC2
- async
- react
- S3
- Class
- 튜플
- dict
- flask
- wetube
- AWS
- Props
- node
- 카톡
- NeXT
- docker
- 파이썬
- SAA
- 채팅
- SSA
- socket io
- pandas
- MongoDB
- RDS
- lambda
- TypeScript
- crud
- Today
- Total
초보 개발자
javascript Class, 생성자함수 본문
const User = function (name, age) {
this.name = name;
this.age = age;
this.showName = function () {
console.log(this.name);
};
};
const mike = new User("mike", 30);
class User2 {
constructor(name, age) {
this.name = name;
this.age = age;
}
showName() {
console.log(this.name);
}
}
const tom = new User2("tom", 19);
User는 생성자함수이고
User2는 클래스이다.
User2의 constructor는 객체를 만들어주는 생성자 메서드이다.
User
age: 30
name: "mike"
showName: ƒ ()
[[Prototype]]: Object
User2
age: 19
name: "tom"
[[Prototype]]: Object
생성자 함수에서 정의한 메서드는 인스턴스 내에 존재하지만
클래스내에 정의한 메서드는 클래스의 prototype에 저장된다. (사용법은 동일)
생성자함수에서도 prototype에 저장할 수 있는 방법이 있다.
User.prototype.showName = function() {
console.log(this.name);
}
이렇게 해주면 된다. User역시 생성자 함수이지만 동시에 Object이기 때문에 가능하다(js에서 함수도 Obj라고 볼 수 있음)
클래스와 생성자함수의 차이는
new를 적지 않았을 때 나타난다.
생성자 함수에서는 new를 적지 않으면 오류가 나지 않고 undefinded가 반환이 되지만
클래스에서는 new를 적지않으면 오류가 난다.
class Car {
constructor(color) {
this.color = color;
this.wheels = 4;
}
drive() {
console.log("drive");
}
stop() {
console.log("stop!!!!");
}
}
class Bmw extends Car {
park() {
console.log("park");
}
stop() {
super.stop();
console.log("stop");
}
}
const z4 = new Bmw();
Car를 상속받아서 Bmw 클래스를 만들 수 있다.
여기서 부모클래스(Car)에 있는 stop메서드를 오버라이딩 할 수 있다. 오버라이딩(이름을 같게함) 하게 되면 부모꺼를 가져다쓰는 것이아니라 자기가 정의한 프로퍼티를 쓸 수 있게된다.
자기가 정의한것도 쓰고 부모에서 정의된 것도 쓰려면
super를 쓰면된다.
또한 Bmw에서는 constructor를 만들지 않았지만 오류가 발생하지 않는다.
왜냐하면 constructor를 생략하면 아래와 같이 자동적으로 부모의 constructor가 발생이 되기 때문이다.
constructor(...args) {
super(...args);
}
그럼 constructor를 만들면 어떻게 될까?? 오류가 난다!!!!!
부모객체에서의 constructor는 {}빈객체를 만들고 this를 사용하여 프로퍼티를 생성하지만
extends로 생긴 자식객체에서는 빈객체를 만드는 것을 생략하기 때문에 오류가 발생하는 것이다.
따라서 constructor를 만들고 싶으면 construct(){ super(), <<< 부모의 constructor를 실행시켜줘야한다.
또한 부모에서 정의한 this.color = color를 사용하기 위해서는 자식의 constructor에서 받아서 보내주는 작업이 필요하다
class Bmw extends Car {
constructor(color) {
super(color);
this.speed = 100;
}
즉 정리하자면 자식은 constructor를 사용하면 빈객체를 만드는 작업을 생략하기때문에 오류가 발생한다.
super()를 사용해야 오류가 발생하지 않고 또 부모의 프로퍼티를 정의하고 싶다면 constructor(color) 자식이 color를 대신 받아서 super(color) 부모에 전달하여 입력하는 절차를 거쳐야한다.
(constructor를 생략했을 때 오류가 나지 않았던 이유는 자동적으로
constructor(...args) {
super(...args);
} 처리가 되었기 때문이다.. 그래서 우리가 수동으로 만들때는 이렇게 똑같이 만들어 주어야한다 !!!