프로토타입 기반 프로그래밍: 객체지향 프로그래밍의 한 형태로 클래스가 없고, 클래스 기반 언어에서 상속을 사용하는 것과 다르게 객체를 원형(프로토타입)으로 하여 복제의 과정을 통해서 객체의 동작 방식을 다시 사용할 수 있다. 복제는 원래 있던 객체의 프로토타입의 행동을 복제하여 새 객체를 생성하는 과정을 거친다. 새 객체는 원본의 모든 특성을 가진다. 이 상테에서 개 객체를 수정할 수도 있다. 일반적인 클래스 기반 객체지향 언어에서 클래스와 인스턴스의 관계와 달리 프로토타입과 파생된 객체는 이 연결을 통해 프로토타입과 자식 객체가 메모리나 구조적 유사성을 가질 필요가 없다.
function Ultra(){}
Ultra.prototype.ultraProp = true;
function Super(){}
Super.prototype = new Ultra();
function Sub(){}
Sub.prototype = new Super();
var o = new Sub();
console.log(o.ultraProp) // true
o.ultraProp의 실행 과정
1. 객체 o에서 ultraProp을 찾는다.
2. 없다면 Sub.prototype.ultraProp을 찾는다.
3. 없다면 Super.prototype.ultraProp을 찾는다.
4. 없다면 Ultra.prototype.ultraProp을 찾는다.
property는 객체와 객체를 연결하는 체인의 역할을 하고, 이러한 관계를 prototype chain이라고 한다.
한편 Super.prototype = Ultra.prototype으로 하면 안된다. 이렇게 하면 Super.prototype의 값을 변경하면 그것이 Ultra.prototype도 변경하기 때문이다.
Super.prototype = new Ultra()를 실행하면 Ultra.prototype의 원형으로 하는 객체가 생성되기 때문에 new Ultra()를 통해 만들어진 객체에 변화가 생겨돋 Ultra.prototype의 객체에는 영향을 주지 않는다.