1. ECMA Script 262 5th edition 4.2.1 Objects 요약

  • 객체는 literal notation (문법적 표기) 방법이나 객체를 생성하는 constructors(생성자)에 의해 생성된다.

  • 각 생성자는 “prototype” 프로퍼티를 가지는 함수이다. 이 프로퍼티는 prototype-based inheritance(프로토타입 기반 상속)shared properties(공유 프로퍼티)를 구현하기 위해 사용된다.

  • 생성자에 의해 만들어진 모든 객체는 생성자의 “prototype” 프로퍼티의 값을 참조하는 implicit reference (객체의 prototype 이라 불림)를 가진다. –> 이게 우리가 스터디에서 말한 “리얼링크” 임.

  • 객체의 prototype 또한 객체이므로 자신의 prototype을 가진다. 때문에 객체들의 prototype은 체인 형태로 서로 연결되어 있으며, 이를 prototype chain 이라 부른다.

  • CF는 생성자 이자 객체이다.

  • 5개의 객체(cf1, cf2, cf3, cf4, cf5)가 new와 CF를 통해 생성됐다.

  • 점선은 implicit prototype 관계를 나타냄. 가령 cf3의 prototype은 CFp이다.

  • CF는 P1, P2  두개의 프로퍼티를 가지고 있으며, 이 값은 CFp, cf1, cf2, cf3, cf4, cf5에게 보이지 않는다.

  • CFp의 CFP1 프로퍼티는 cf1, cf2, cf3, cf4, cf5 (CF는 아니다.)에 서로 공유된다.

  • CF와 CFp 사이에는 implicit prototype link가 존재하지 않는다.

  •  CFp에 프로퍼티를 추가하면 cf1~cf5 모든 객체가 공유하는 공유 프로퍼티

정리하자면,

1. prototype 프로퍼티란?

모든 함수 객체(특히 생성자)는 prototype 프로퍼티를 가지고 있으며, prototype 프로퍼티는 디폴트로 empty object를 가리킨다. 여기서 말하는 prototype은 ‘함수 객체가 가지는 prototype 프로퍼티‘를 의미하며, 이것은 객체(object)다..

–> 반면, 모든 객체가 prototype 프로퍼티를 가지고 있지는 않다.

2. prototype이란?

1에서 설명한 prototype 프로퍼티와 구분하자.

new와 생성자를 통해 생성된 객체는 ‘생성자 함수의 prototype 프로퍼티가 가리키는 객체‘를 연결하는 링크를 가지고 있다. 이 링크는 implicit prototype link (암묵적 프로토타입 링크)라고 불린다.  크롬 브라우저의 경우는 proto 프로퍼티가 그런 역할을 한다. 보통 우리가 흔히 사용하는  prototype은 새로 생성된 객체의 implicit 링크가 가리키는 ‘생성자 함수의 prototype’ 객체를 의미한다.

–> 특정 객체의 prototype은   그 객체의 ‘생성자 함수의 prototype 프로퍼티가 가리키는 객체’다.

참고:   ‘ 생성자’와  ’이를 통해 생성된 객체’는 직접적으로 연결되어 있지 않다.

그렇다면, 생성된 객체는 자신의 생성자를 어떻게 알 수 있는가?? 이것의 비밀이 바로 prototype인 것이다.  위 설명에서도 말했듯이,

‘새로 생성된 객체의 prototype == 생성자의 prototype 프로퍼티가 참조하는 객체’ 이다.

또한 생성자의 prototype 프로퍼티가 가리키는 객체는 constructor 이라는 프로퍼티를 가지고 있는데, 이 프로퍼티가 생성자 함수를 가리키고 있다.

따라서, 특정 객체는 자신의  prototype을 통해서 자신의 생성자 함수를 구할 수 있는 것이다.

 

3. prototype-chain이란?

2번에서 설명했던것 처럼, 새로 생성된 객체는 prototype 객체와 링크로 연결되어 있으며, 연결된 prototype 객체 또한 자신의 ‘생성자 함수의 prototype’ 프로퍼티 객체와의 링크로 연결되어 있다. 이를 prototype-chain 이라 부른다.

JavaScript에서 객체의 프로퍼티를 참조할 때, 해당 객체 내에 참조할 프로퍼티가 없는 경우는 prototype-chain을 따라 상위 prototype 객체로 이동하면서 참조하는 프로퍼티가 있는지 확인한다. 만약 chain의 끝까지 검색했을 때도 없는 경우는 undefined 에러를 출력한다.

다음의 예제를 참조하자.