자바스크립트의 객체는 [[Prototype]]이라는 숨김 속성을 갖는다. 이 속성은 null이거나 다른 객체에 대한 참조를 한다. 이때 참조하는 대상 객체를 프로토타입이라 한다.
자바스크립트는 object에서 속성을 읽으려 하는데 해당 속성이 없으면 자동으로 프로토타입 객체에서 속성을 찾는다.
const animal = {
eat: console.log("냠냠"),
};
const rabbit = {
jump: true,
};
rabbit.prototype = animal;
rabbit.eat;
console.log(rabbit);
간단한 프로토타입 예시
rabbit 객체의 프로토타입은 animal이 되며, "rabbit은 animal 객체를 상속받는다" 라고 표현할 수 있다.
따라서 rabbit 객체 내에서 eat 메서드에 접근할 수 있는데, 이러한 프로퍼티를 '상속 프로퍼티(inherited property)'라고 한다.
const animal = {
eats: true,
walk() {
console.log("우당탕탕");
},
};
const tiger = {
makeSound() {
console.log("어흥");
},
__proto__: animal,
};
const reflection = {
isQuick: true,
__proto__: tiger,
};
reflection.walk();
console.log(reflection.eats);
reflection 객체는 tiger 객체를 프로토타입으로 갖고, tiger 객체는 animal 객체를 프로토타입으로 갖는다. 이렇게 프로토타입이 줄줄이 소세지처럼 이어지는 걸 프로토타입 체이닝이라 한다.
프로토타입 체이닝엔 세 가지 제약 사항이 있다.
1. 순환 참조(circular reference)는 허용되지 않는다.
프로토 타입은 속성을 읽을 때에만 사용한다. 속성을 추가, 수정, 삭제하는 연산은 객체에 직접 해야 한다.