

프로토타입 = 원본의 유전자
자바스크립트의 프로토타입(Prototype)은 객체가 다른 객체로부터 상속받을 수 있는 속성과 메서드를 정의하는 것이다.

자바스크립트의 모든 객체는 프로토타입을 가진다. 객체 본인의 속성, 메서드에 접근할 수 있으면서 프로토타입의 속성, 메서드에도 접근할 수 있다. 객체는 자신의 프로토타입에 정의된 속성과 메서드를 상속받는다(유전).
모든 객체는 [[Prototype]]이라는 숨겨진 속성을 가지며, 이 속성은 객체의 프로토타입을 가리킨다. 자신의 부모 역할을 하는 객체와 연결되어 있고, 그 부모 객체가 프로토타입이다. 그래서 자신과 그 아래 자식 객체들도 부모 객체의 속성, 메서드에 접근이 가능하다. 조상 유전자를 다 갖고 있기 때문이라고 생각하면 이해가 쉽다.
Object.getPrototypeOf() const proto = Object.getPrototypeOf(obj);
__proto__Object.getPrototypeOf() 사용이 권장const proto = obj.__proto__;
Object.prototype.isPrototypeOf()const isProto = Object.prototype.isPrototypeOf(obj);
super(ES6)class ChildClass extends ParentClass {
constructor() {
super();
const parentProto = super.__proto__;
}
}

객체는 자신의 프로토타입이 가리키는 다른 객체의 속성과 메서드를 찾을 수 있다. 탐색은 프로토타입 체인이 연결된 객체에 한해서 가능하다.
프로토타입이 가리키는 프로토타입의 프로토타입을 순차적으로 검색하여 원하는 속성, 메서드를 찾는다. 만약 조상 객체에서 찾지 못한 속성, 메서드는 undefiend가 나온다.
자식 객체는 부모 객체의 프로토타입을 자신의 프로토타입으로 사용하여 부모 객체의 속성과 메서드를 상속받는다.
여러 객체가 동일한 프로토타입을 공유할 때, 각 객체가 자신의 모든 속성과 메서드를 가지고 있는 것이 아니라 프로토타입을 참조하게 되므로 메모리를 절약할 수 있다.
런타임에 객체의 속성, 메서드를 동적으로 추가 및 제거할 수 있다. 자바스크립트의 동적 특성을 활용하여 객체를 유연하게 확장할 수 있는 장점이 있다.
다양한 객체가 동일한 기본 동작을 공유할 수 있으므로 코드의 재사용성이 증가한다.(추상화)
프로토타입 기반의 언어에서는 메서드 디스패치가 동적으로 이루어진다. 프로토타입 체인을 따라 메서드를 검색하여 실행함으로써 객체 간에 동적인 상호작용을 돕는다.