Object.create()
__proto__ 대신에 'Object.create()' 를 사용해서 prototype link(명확한 상속관계)를 지정해줄 수 있다.
<형태>
let lee = Object.create(kim);
kim을 부모로 하는 자식객체 lee를 만들어줘
let superObj = {superVal:'super'}
//let subObj = {subVal:'sub'}
//subObj.__proto__ = superObj;
let subObj = Object.create(superObj);// superObj를 부모로 하는 새로운 객체,보다 prototype link(명확한 상속관계)를 확립!
subObj.subVal = 'sub';
//주석처리를 한 위의 코드와 똑같이 동작
console.log('subObj.subVal =>',subObj.subVal);
console.log('subObj.superVal =>',subObj.superVal);
subObj.subVal = 'sub';
console.log('superObj.superVal =>',superObj.superVal);
예시
// Object.create() 버전의 객체상속
let kim = {
name:'kim',
first:10, second:20,
sum:function(){return this.first+this.second}// 아래의 콘솔이 실행될때, 여기서의 this는 kim이 아니라, lee다 // 자바스크립트에서 함수는 신이다. 함수는 어떤 객체에 종속될 수도 있지만, 그냥 혼자서 잘 지내다가 필요에 따라서 어떤 객체의 메소드도 될 수 있다!
}
//sum은 또 쓰기 싫어요!
let lee = Object.create(kim);//kim을 부모로 하는 자식객체 lee를 만들어줘
lee.name = 'lee';
lee.first = '10';
lee.second = '10';
lee.avg = function(){
return (this.first + this.second)/2;
}
console.log('lee.sum():', lee.sum());//먼저, lee라는 객체에 sum이 있는지를 찾아본다. 없다면, 'Object.create()'로 연결된 kim에 sum이 있는지를 찾는다.
// 객체 lee는 sum이라는 메소드를 가지고 있지 않지만, 실행이 될까? ㅇㅇ
// lee.sum(): 20
console.log('lee.avg():', lee.avg());
//lee는 kim이 가지지 않는 avg 라는 기능도 가질 수 있다
정리
자바스크립트 흥미롭지 않나요?
유연하다 못해 기이한느낌..
주류의 class 문법처럼 class가 class를 상속하는 것이 아니라 객체가 다른 객체를 상속하는데
그걸 run time(실행되고 있는 동안)에 다른 곳에서 상속을 바꿀 수 있다
어떻게?
'__proto__' 나 'Object.create()'를 써서!
'Javascript' 카테고리의 다른 글
call (=this 값을 바꾸는 명령) (0) | 2023.03.12 |
---|---|
객체상속의 사용 (0) | 2023.03.12 |
'__proto__' (=관습적으로 써온 상속관계) (0) | 2023.03.12 |
super 키워드 (0) | 2023.03.12 |
Class Inheritance(상속) (0) | 2023.03.12 |