[OOP]프로토타입
JavaScript는 프로토타입 기반 언어(prototype-based language)라 불림
모든 객체들이 메소드와 속성들을 상속 받기 위한 템플릿으로써 프로토타입 객체(prototype object)를 가진다는 의미
프로토타입 객체는 메소드와 속성을 상위 프로토타입으로 부터 상속 받을 수도 있고 그 상위 프로토타입 객체도 마찬가지, 이를 프로토타입 체인(prototype chain)이라 부름
다른 객체에 정의된 메소드와 속성을 한 객체에서 사용할 수 있도록 하는 근간
상속되는 속성과 메소드들은 각 객체가 아니라 객체의 생성자의 prototype이라는 속성에 정의되어 있음
function Person(first, last) {
this.first = first;
this.last = last;
}
const person1 = new Person("DK", "Choi");
console.log(person1.valueOf());
- 브라우저는 person1 객체가 valueOf() 메소드를 가지고 있는지 체크
- 없으므로 person1의 프로토타입 객체(Person() 생성자의 프로토타입)에 valueOf() 메소드가 있는지 체크
- 없으므로 Person() 생성자의 프로토타입 객체의 프로토타입 객체(Object() 생성자의 프로토타입)가 valueOf() 메소드를 가지고 있는지 체크. 있음, 호출 끝
프로토타입 속성: 상속 받은 멤버들이 정의된 곳
Object.prototype.watch(), Object.prototype.valueOf() 등은 생성자를 통해 새로 생성되는 인스턴스는 물론 Object.prototype을 상속 받는 객체라면 어떤 객체에서든 접근 가능
Object.is(), Object.keys()등 prototype 버킷에 정의되지 않은 멤버들은 상속되지 않음. 이것들은 Object() 생성자에서만 사용 가능
class Human {
constructor(name, age) {
this.name = name;
this.age = age;
}
sleep() {
console.log(`${this.name}은 잠에 들었습니다`);
}
}
let kimcoding = new Human("김코딩", 30);
Human.prototype.constructor === Human;
Human.prototype === kimcoding.__proto__;
Human.prototype.sleep === kimcoding.sleep;
console.log(Human.prototype.constructor); // Human이 생성자에게 상속하는 prototype
console.log(Human); // class Human object 자체
console.log(kimcoding.__proto__); // 김코딩이 상속받은 Human에서 정의된 prototype
console.log(Human.prototype); // Human에서 정의된 prototype
console.log(kimcoding.sleep); // 김코딩이 상속받은 Human에 정의된 메서드
console.log(Human.prototype.sleep); // Human에서 정의된 메서드
댓글남기기