JS는 프로토타입 기반 언어이다.

프로토타입 메소드 체이닝을 통해 프로토타입으로 가지고 있는 객체의 메소드들을 사용할 수 있다.

prototype 프로퍼티와 [[prototype]] 을 구분할 필요가 있는데, [[prototype]]은 ES6까지는 표준이 아니었지만 사실상의 표준으로서 브라우저에서는 구현이 되어왔으며, ES6부터는 표준화되었다.

JS에서는 함수가 정의될 때 함수객체를 생성하면서 프로토타입 객체를 함께 생성한다. 생성된 프로토타입 객체는 함수가 생성자로 사용될 때, 생성자로 생성된 새 객체의 프로토타입이 된다.

함수의 prototype 프로퍼티는 함수객체와 함께 생성된 프로토타입 객체를 가리키고 있으며, 프로토타입 객체에는 constructor 프로퍼티가 존재한다.

Untitled

또한 constructor 프로퍼티는 프로토타입 객체와 함께 생성된 함수객체를 가리키고 있다.

MDN 문서에서는 [[prototype]] 에 직접 접근하여 수정하는것은 좋지 않은 방법이라고 소개하고 있다. 상속구조를 변경하기 때문에 성능에 미치는 영향이 미묘하고 광범위하기 때문이다. 대신에 Object.getPrototypeOf / Object.setPrototypeOf 메소드를 사용하는 것을 권장한다.