포로토타입과 프로토타입 체인에 대해서 알아보자
어떤 객체의 상위객체의 역할을 하는 객체로서 다른 객체에 공유 프로퍼티,메서드를 제공한다.
모든 객체는 [[prototype]]을 갖는다. 그리고 모든 [[prototype]]은 생성자 함수와 연결되어 있다.즉, 객체(인스턴스)와 프로토타입과 생성자 함수(클래스)는 다음과 같이 서로 연결되어 있다.
prototype 도 객체이고 모든 객체는 prototype을 가지므로 자신의 prototype을 갖는다. 생성된 prototype의 prototype은 Object.prototype이다.
[[prototype]]은 (내부슬롯)이기 때문에 직접적으로 접근하거나 호출 할수 없다.
_ _proto_ _ 접근자 프로퍼티를 통해 간접적으로 프로토타입에 접근 할 수있다.
function Person(name){
this.name = name;
}
const me = new Person('Joon');
//Person.prototype 과 me.__proto__은 동일한 주소를 참조한다.
console.log(Person.prototype === me.__proto__);// true
내부 슬롯 : ECMAScript 사양에 등장하는 이중대괄호로 감싼 이름들이 내부 슬롯과 내부 메서드다. 내부슬롯과 네부메서드는 자바스크립트 엔진의 내부 로직이므로 직접적으로 호출하거나 접근이 불가하다.
접근자 프로퍼티 : 자체적으로 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할때 사용하는 접근자 함수로 구성된 프로퍼티 이다.
_ _proto_ _ 는 상속을 통해 사용된다.
_ _proto_ 은 객체가 직접 소유하는 프로퍼티가 아니라 Object.prototype의 프로퍼티다. 모든 객체는 상속을 통해 Object.prototype._ _proto _접근자 프로퍼티를 사용할 수 있다.
상속은 프로토타입 체인에 의하여 구현된다.
프로토타입 체인은 자바스크립트가 객체지향 프로그래밍의 상속을 구현하는 매커니즘이다.
자바스크립트는 객체의 프로퍼티에 접근하려고 할 때 객체에 접근하려는 프로퍼티가 없다면 [[prototype]] 참조에 따라 자신의 부모 역할을 하는 프로토타입의 프로퍼티를 순차적으로 검색한다. 이를 프로토타입 체인이라 한다.
프로토타입 체인의 최상단에 위치하는 객체는 언제나 Objcet.prototype 이다. 따라사 모든 Objcet.prototype 을 상속받는다. Objcet.prototype 의 프로토타입 즉, [[prototpye]] 내부 슬롯의 값은 null이다.
Objcet.prototype 에서도 프로퍼티를 검색할 수 없는 경우 에러가 나는것이 아닌 undefined가 반환된다.