Java를 공부하면서 분명 숙지하고 있던 내용인데, 이번에 제대로 알고 가는 계기가 되었다.
// 기본 클래스
class Animal {
distance: number;
constructor(dist: number) {
this.distance = dist;
}
move() {
console.log(this.distance + "m 움직였습니다.");
}
}
// 상속받은 서브 클래스
class Snake extends Animal {
constructor(dist: number) { // 에러 발생!, 클래스의 생성자는 'super' 호출을 포함해야 합니다.
}
move() {
super.move();
}
}
상속받은 서브 클래스에서 super 키워드를 통해 부모의 생성자를 호출해줘야 한다.
그 이유는 2가지로 나눌 수 있다.
Snake
에서 super()
를 통해 기본 클래스 Animal
의 생성자를 호출함으로,super()
를 통해 기본 클래스의 생성자를 호출해야 제대로 초기화가 된다.Animal
의 생성자는 클래스의 초기 상태를 설정하는 역할을 한다.상태
란 객체의 상태를 뜻하는 멤버 변수(필드)
를 의미한다.앞으로는 까먹지 않고 잘 해야겠다.
React를 하면서 지나친 화살표 함수로 인해, 다음과 같은 실수를 범했다
class Animal {
distance: number;
constructor(dist: number) {
this.distance = dist;
}
move = () => {
console.log(this.distance + "m 움직였습니다.");
}
}
class Snake extends Animal {
constructor(dist: number) {
super(dist);
}
move = () => {
super.move(); //X 에러, 기본 클래스의 공용 및 보호된 메서드만 'super' 키워드를 통해 액세스할 수 있습니다.
}
}
this
컨텍스트를 갖지 않고, 주변 스코프의 this
를 상속받는다.this
를 갖지 않으므로, 같은 클래스 내부가 아닌 외부 스코프에서 super
를 찾는다.super
객체가 없기 때문에, 찾을 수 없어 에러가 발생한 것이다.this
컨텍스트를 생성한다. super
키워드를 통해 부모 클래스에 접근할 수 있다.진작에 보면 좋았을 포스트.. 🥲
[JavaScript] 화살표 함수와 this 바인딩