#0. 오늘은 결론먼저..
extends
class를 상속할때 사용
super :
1) (클래스 extends시 costructor에) 부모 한번 돌고와서 this값 잘 바인딩하려고 사용
2) 부모의 prototype가져올때도 사용
#1. 적용해나가는 기나긴 과정
1. grandPapa의 속성을 그대로 물려받은 class를 만들고 싶을때 - extends 사용하면 됨.
class grandPapa {
constructor(name) {
this.firstName = "Kim";
this.name = name;
}
}
var grandPapa1 = new grandPapa("동식"); >> {firstName: 'Kim', name: '동식'}
2. extends 는 다음과 같은 방식으로 사용가능하다.
// 1. 물려받고싶은 클래스는 여기있고
class 물려받고싶은클래스명 {
constructor(){
// 지정하고싶은속성 넣기
}
}
// 2. 그걸 물려받은 클래스 여기서 생성하고 있는거임.
class 생설될클래스명 extends 물려받고싶은클래스명{
constructor(){
//추가로 지정하고싶은 속성
}
}
2-1. (!!! 틀린예 !!!) 그렇게 적용시키면,, 다음과 같이 적을텐데.. (!!! 이거는 틀린예임..!!!!!!)
>> 이런상황에서 필요한게 super()
// 1. 물려받고싶은 클래스
class grandPapa {
constructor(name) {
this.firstName = "Kim";
this.name = name;
}
}
// 2. 물려받는 클래스
// class 생설될클래스명 extends 물려받고싶은클래스명
class papa extends grandPapa {
constructor(){
//추가로 지정하고싶은 속성
this.age = 50;
}
}
var papa1 = new papa(); // 실행결과 >> Must call super constructor in derived class before accessing 'this' or returning from derived constructor
- 에러 보면 this를 사용하려면 super를 꼭 불러와달라는 소리다.
2-2. (!!!! 틀린예 2 !!!!) super넣기 (!!! 조금 더 낫지만 파라미터 못가져오는 애임 !!!!)
- super();를 사용하니, papa1 실행시, 에러는 뜨지 않는다.
- 그런데 문제가 있다. name이 undefined라고? >> 파라미터 잘 추가해주면된다.
// 1. 물려받고싶은 클래스
class grandPapa {
constructor(name) {
this.firstName = "Kim";
this.name = name;
}
}
// 2. 물려받는 클래스
class papa extends grandPapa {
constructor(){
// 걍 이렇게 쓰면된다.
super();
this.age = 50;
}
}
var papa1 = new papa();
papa1; // 실행결과 >> papa {firstName: 'Kim', name: undefined, age: 50}
2-3. (!!! 맞는예 !!!) 파라미터도 잘 추가해주자.
- 파라미터는 constructor와 super ()안에 잘 넣어주면된다.
- super()는 부모 잠깐 돌고와줘! 라는 메세지.
- 그래서 부모에 들어갈 파라미터를 super()안에 넣어주면 된다.
- 50살 삼식이 잘 가져온다.
- 그런데 내가 papa의 age를 파라미터로 가져오고 싶다면?
// 1. 물려받고싶은 클래스
class grandPapa {
constructor(name) {
this.firstName = "Kim";
this.name = name;
}
}
// 2. 물려받는 클래스
class papa extends grandPapa {
constructor(name){
// 걍 이렇게 쓰면된다.
super(name);
this.age = 50;
}
}
var papa1 = new papa('삼식');
papa1; // 실행결과 >> papa {firstName: 'Kim', name: '삼식', age: 50}
2-4. (!!! 미션1. !!!) papa의 age를 파라미터로 가져오기
>> papa의 constructor에 age추가 (!주의!) super는 age필요 없으니까, 거긴 안추가해도 된다.
- 다시말하지만, super는 부모 잠깐 갔다와줘 라는 부탁, 부모는 age필요없다.
// 1. 물려받고싶은 클래스
class grandPapa {
constructor(name) {
this.firstName = "Kim";
this.name = name;
}
}
// 2. 물려받는 클래스
class papa extends grandPapa {
constructor(name, age){
// 걍 이렇게 쓰면된다.
super(name);
this.age = age;
}
}
var papa1 = new papa('삼식', 48);
papa1; // 실행결과 >> papa {firstName: 'Kim', name: '삼식', age: 50}
2-5. (!!! super 기능2 !!!) 부모 prototype 함수 가져오기
- super쓰면 부모 prototye의 데이터도 가져올수있다.
- grandPapa, papa 각각의 prototype에 sayHi()를 넣어보자.
- 이 상태에서 papa.sayHi();를 출력한다면? >> 가장 가까운 papa prototype에 있는 안녕 난 아버지 출력할거다.
class grandPapa {
constructor(name) {
this.firstName = "Kim";
this.name = name;
}
sayHi() {
// 할아버지 prototype에 추가되는 함수
console.log("안녕 난 할아버지");
}
}
class papa extends grandPapa {
constructor(name) {
super(name); // costrucor안의 super : 부모 class의 constructor의미
this.age = 50;
}
sayHi() {
console.log("안녕 난 아버지");
}
}
var papa1 = new papa("광렬");
papa1.sayHi(); // 출력결과 >> 안녕 난 아버지
- 근데 papa.sayHi();하면 부모의 sayHi()도 실행하고 싶다? >> super.sayHi() 넣기
class grandPapa {
constructor(name) {
this.firstName = "Kim";
this.name = name;
}
sayHi() {
// 할아버지 prototype에 추가되는 함수
console.log("안녕 난 할아버지");
}
}
class papa extends grandPapa {
constructor(name) {
super(name); // costrucor안의 super : 부모 class의 constructor의미
this.age = 50;
}
sayHi() {
console.log("안녕 난 아버지");
super.sayHi(); // 부모 class 의 prototype을 의미
// 부모.prtotype에 저장된 sayHi()를 실행해주셈
}
}
var papa1 = new papa("광렬");
papa1.sayHi();
// 출력결과 >>
// 안녕 난 아버지
// 안녕 난 할아버지
'Study > JavaScript' 카테고리의 다른 글
[JavaScript] import/ export : js파일 모듈식으로 가져오고(import), 내보내기(export) (0) | 2023.06.27 |
---|---|
[JavaScript] 배열, 오브젝트안의 값들을 한꺼번에 변수에 담으려면? > Destructuring (0) | 2023.06.27 |
[JavaScript] 객체지향3. Object.create() : 간단하게 부모 속성 상속받기 (0) | 2023.06.24 |
[JavaScript] 객체지향2. Prototype = 유전자 (0) | 2023.06.23 |
[JavaScript] 객체지향1. Constructor = Object 뽑아내는 기계 (0) | 2023.06.23 |