JS는 프로토타입 기반 언어이다.
프로토타입 메소드 체이닝을 통해 프로토타입으로 가지고 있는 객체의 메소드들을 사용할 수 있다.
prototype 프로퍼티와 [[prototype]] 을 구분할 필요가 있는데, [[prototype]]은 ES6까지는 표준이 아니었지만 사실상의 표준으로서 브라우저에서는 구현이 되어왔으며, ES6부터는 표준화되었다.
JS에서는 함수가 정의될 때 함수객체를 생성하면서 프로토타입 객체를 함께 생성한다. 생성된 프로토타입 객체는 함수가 생성자로 사용될 때, 생성자로 생성된 새 객체의 프로토타입이 된다.
함수의 prototype 프로퍼티는 함수객체와 함께 생성된 프로토타입 객체를 가리키고 있으며, 프로토타입 객체에는 constructor 프로퍼티가 존재한다.
또한 constructor 프로퍼티는 프로토타입 객체와 함께 생성된 함수객체를 가리키고 있다.
MDN 문서에서는 [[prototype]] 에 직접 접근하여 수정하는것은 좋지 않은 방법이라고 소개하고 있다. 상속구조를 변경하기 때문에 성능에 미치는 영향이 미묘하고 광범위하기 때문이다. 대신에 Object.getPrototypeOf / Object.setPrototypeOf 메소드를 사용하는 것을 권장한다.