JavaScript는 프로토타입 기반 언어(prototype-based language)이다.
모든 객체들이 메소드와 속성들을 상속 받기 위한 템플릿으로써 자신의 부모 역할을 담당하는 객체인 **프로토타입 객체(prototype object)**를 가진다는 의미이다.
자바스크립트의 모든 객체는 자신의 프로토타입 객체를 가리키는 [[Prototype]] 인터널 슬롯을 가지고 있으며 상속을 위해 사용된다. "객체명.__proto__
"을 통해 접근할 수 있다.
__proto__
는 크롬 브라우저에서 사용하는 프로퍼티명이고, ECMA 명세서에는 [[Prototype]]이라는 이름으로 사용한다.
var student = {
name: 'Jaem'
};
console.log( student.__proto__ === Object.prototype ); // true
객체를 생성할 때 프로토타입 객체는 결정되며 결정된 프로토타입 객체는 다른 임의의 객체로 변경할 수 있다. 이것은 부모 객체인 프로토타입을 동적으로 변경할 수 있다는 것을 의미한다. 이러한 특징을 활용하여 객체의 상속을 구현할 수 있다.
함수도 객체이므로 [[Prototype]] 인터널 슬롯을 갖는다. 그런데 함수 객체는 일반 객체와는 달리 prototype 프로퍼티도 소유하게 된다.
function Person(name) {
this.name = name;
}
var foo = new Person('Lee');
console.log(Person.prototype); // {constructor: ƒ}
console.log(foo.prototype); // undefined
console.log(Person.__proto__ === Function.prototype); // true
console.log(Person.prototype === foo.__proto__); // true