23.10.14 프로토타입
프로토타입
자바스크립트의 모든 객체는 자신의 부모 역할을 담당하는 객체와 연결되어 있다. 그리고 이것은 마치 객체 지향의 상속 개념과 같이 부모 객체의 프로퍼티 또는 메소드를 상속받아 사용할 수 있게 한다. 이러한 부모 객체를 프로토타입 객체 또는 줄여서 프로토타입이라 한다.
즉, 프로토타입은 한 객체가 다른 객체로부터 속성과 메서드를 상속받을 수 있게 하는 기본 객체 또는 참조이다.
프로토타입체인
자바스크립트는 특정 객체의 프로퍼티나 메소드에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티 또는 메소드가 없다면 [[Prototype]]이 가리키는 링크를 따라 자신의 부모 역할을 하는 프로토타입 객체의 프로퍼티나 메소드를 차례대로 검색한다.
[[Prototype]] vs prototype 프로퍼티
[[Prototype]]
함수를 포함한 모든 객체가 가지고 있는 인터널 슬롯이다.
prototype 프로퍼티
함수 객체만 가지고 있는 프로퍼티이다. 함수 객체가 생성자로 사용될 때 이 함수를 통해 생성될 객체의 부모 역할을 하는 객체(프로토타입 객체)를 가리킨다.
constructor 프로퍼티
프로토타입 객체는 constructor 프로퍼티를 갖는다. 이 constructor 프로퍼티는 객체의 입장에서 자신을 생성한 객체를 가리킨다.
__proto__
객체의 내부 [[Prototype]] 프로퍼티를 나타내는, 일부 브라우저에서 제공하는 비표준 속성이다. 객체에서 프로퍼티를 찾을 때 해당 프로퍼티가 객체 자체에 없으면, JavaScript는__proto__에 연결된 객체에서 프로퍼티를 찾는다. __proto__ 프로퍼티에 접근하면 내부적으로 Object.getPrototypeOf가 호출되어 프로토타입 객체를 반환한다.