이전에 작성한 PersonPlus class에만 third라는 새로운 인자를 추가하고 싶다고 가정하자
아래와 같이 코드처럼 PersonPlus에 Person의 기능을 모두 가져와 수정하면 상속의 의의가 없어지게 되는 문제가 있다.
/** PersonPlus */
class PersonPlus extends Person{
constructor(name, first, second, third){
this.name = name;
this.first = first;
this.second = second;
this.third = third;
}
sum(){
return this.first + this.second + this.third;
}
avg(){
return (this.first + this.second + this.third) / 3;
}
}
이럴때 사용되는 키워드가 바로 Super다.
super의 용법은 두가지가 있다.
- 부모 클래스의 생성자 호출
super()
- 부모 클래스
super.sum()
만약 PersonPlus의 constructor가 실행되기 전에 부모 클래스의 기능이 먼저 실행되도록 하는게 어떨까?
class Person{
constructor(name, first, second){
this.name = name;
this.first = first;
this.second = second;
}
sum(){
return this.first + this.second;
}
}
/** PersonPlus */
class PersonPlus extends Person{
constructor(name, first, second, third){
super(name,first,second);
this.third = third;
}
sum(){
return super.sum() + this.third;
}
avg(){
return (this.first + this.second + this.third) / 3;
}
}
var kim = new PersonPlus('kim', 10, 20, 30);
console.log("kim.sum() : ", kim.sum());
console.log("kim.avg() : ", kim.avg());
결과
kim.sum() : 60
kim.avg() : 20
super키워드는 부모 오브젝트의 함수를 호출할 때 사용된다.
super() 부모 클래스 생성자 호출
super.method() 부모 클래스 메소드 실행
super를 사용 하면 자식클래스는 부모의 기능을 사용할 수 있고,
자식만의 추가적인 기능을 만들 수 있어 불필요한 코드가 늘어나지 않고 상속도 의미가 있어진다.