JS 는 객체의 프로퍼티에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티가 없다면 [[Prototype]] 내부 슬롯의 참조를 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 이를 프로토타입 체인이라고 한다. 이는 자바스크립트가 객체지향 프로그래밍의 상속을 구현하는 메커니즘이다.
체인의 최상위에 위치하는 객체는 Object.prototype 이다. 모든 객체는 Object.protytpe을 상속받는다. Object.prototype 를 프로토타입 체인의 종점이라고 한다.
Object.prototype 에서도 프로퍼티를 검색할 수 없는 경우 undefinded를 반환한다. 에러가 발생하지 않는 것에 주의!
프로토타입 체인은 상속과 프로퍼티 검색을 위한 메커니즘이다. 이해 반해 스코프 체인은 식별자 검색을 위한 메커니즘이다.
me.hasOwnProperty('name');
const Person = (function () {
// 생성자 함수
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function () {
console.log(`Hi! My name is ${this.name}`);
};
// 생성자 함수를 반환
return Person;
}());
const me = new Person('Lee');
// 인스턴스 메서드
me.sayHello = function () {
console.log(`Hi! My name is ${this.name}`);
};
// 인스턴스 메서드가 호출된다. 프로토타입 메서드는 인스턴스 메서드에 의해 가려진다.
me.sayHello(); // Hi! My name is Lee
// 인스턴스 메서드 삭제
delete me.sayHello;
me.sayHello(); //Hi! My name is Lee
// 프로ㅗ 타입 메서드 변경
Person.prototype.sayHello = function () {
console.log(`Hey! My name is ${this.name}`);
};
me.sayHello();
// 프로토타입 메서드 삭제
delete Person.prototype.sayHello;
me.sayHello(); // TypeError: me.sayHello is not a function
객체 instanceof 생성자 함수
위 글은 위키북스의 모던 자바스크립트 Deep Dive 를 읽고 정리한 내용입니다.