프로토타입 상속
프로토타입 상속
자바스크립트는 객체지향 언어인가?
- 그렇습니다. 다만 다른 언어와는 달리 프로토타입 상속에 기반을 둔 OOP언어입니다. => Class 문법지원 => 다른언어와 비슷.
상속의 필요성
- 가장 큰 목적은 재사용입니다.
- 이미 부모쪽에서 정의된 속성과 메서드를 그대로 물려받아 재사용할 수 있습니다.
- 새로운 기능을 추가해서 기존 기능에서 더 확장시킬 수도 있습니다.
- 중복해서 또 작성하지 않아서 좋고, 필요에 따라서는 더 확장도 가능합니다.
프로타입 체인
__proto__
는 상속을 해준 부모(원형)를 가리킵니다.(참조).- 자식 객체가
__proto__
가 가리키는 부모 객체의 멤버(속성, 메서드)를 사용할 수 있습니다.
let obj = {
name: '홍길동',
age: 20,
sayHi: function() {
console.log("Hi~" + this.name);
}
};
let obj2 = {
name: "이순신"
};
// 여기서 obj2 객체의 __proto__속성이 가리키는것은 0bject(최상위)이다.
// 여기서 __proto__속성이 가리키는 것을 바꿀수있는가? yes
obj2.__proto__= obj1; //이렇게 하면 obj2의 부모(원형)이 obj1이 된다.
// 즉, obj2는 obj1이 가지는 멤버를 사용할 수 있게 됨.
console.log(ob2.name); // 이순신 => 출력되는 이유는 obj2 객체내에 name 속성이 있으니까 부모까지 찾으러 안가고 출력.
console.log(obj2.age); // 20 => 출력되는 이유는 obj2 객체내에 age 속성이 없으니까 부모까지 찾아 올라감.
obj2.sayHi(); // Hi~ 이순신
빈 객체 생성후
-
__proto__
속성에 원하는 객체(부모가 될 또는 원형이 될)를 할당(상속).let obj = { name: '홍길동', age: 20, sayHi: function() { console.log("Hi~" + this.name); } }; let obj2 = { name: "이순신" }; let obj3 = {}; obj2.__proto__ = obj1 obj3.__proto__ = obj2; // 이렇게 바꾸면 obj2의 부모(원형)인 obj1의 멤버까지 모두 상속을 받아 이용. console.log(obj3.hasOwnProperty("asdasd")); // false console.log(obj3.name); // 이순신 console.log(obj3.age); // 20 obj3.sayHi(); // Hi~ 이순신
정리
- 위 예제를 통해서 알 수 있듯이 자바스크립트는 자신에게 없는 특성(속성, 메서드)을
__proto__
가 가라키는 부모(원형)에서 가져옵니다. - 맨 하위 자식 객체에서 부터 순착적으로 연결되어있는 원형을 찾아갑니다. ==> “프로토타입 체인”
- 즉,
__proto__
속성이 가리키는 부모(원형)이 바로 상속을 해준 부모(원형)가 바로 상속을 해준 부모입니다. <== 이 객체를 해당 객체의 프로토타입 부모(원형)라고 합니다. - 이와 같이, JS는 프로토타입 체인을 사용하여 객체의 특성(속성, 메서드)를 다른 객체로 전파합니다. ==> “프로토타입 상속”
- “프로토타입 상속”으로 구현하는 객체지향 언어를 **“프로토타입 기반의 객체지향 언어” ** 라고 합니다.
댓글남기기