자바스크립트는 프로토타입 기반 언어이다. 클래스 기반 언어에서는 '상속'을 사용하지만 프로토타입기반 언어에서는 어떤 객체를 원형으로 삼고 이를 복제(참조)함으로써 상속과 비슷한 효과를 얻는다.
→ new 연산자로 Constructor를 호출하면 instance가 만들어지는데, 이 instance의 생략 가능한 프로퍼티인 '⎽⎽proto⎽⎽' 는 Constructor의 prototype을 참조한다.
좀 더 자세히 설명하면, new 연산자와 함께 함수를 호출할 경우, 그로부터 생성된 인스턴스에는 숨겨진 프로퍼티인 '⎽⎽proto⎽⎽'가 자동으로 생성되며, 이 프로퍼티는 생성자 함수의 prototype 프로퍼티를 참조한다. '⎽⎽proto⎽⎽' 프로퍼티는 생략 가능하도록 구현돼 있기 때문에 생성자 함수의 prototype에 어떤 메서드나 프로퍼티가 있다면 인스턴스에서도 마치 자신의 것처럼 해당 메서드나 프로퍼티에 접근할 수 있게 된다.
prototype과 constructor는 부모자식 관계라고 생각하면 된다. Person.prototype.constructor === Person; 이다.
또한 Person.prototype === (Person생성자로 만들어진 객체).proto; 이기 때문에 (Person생성자로 만들어진 객체).proto.constructor === Person; 도 성립한다.
어떤 데이터의 '⎽⎽proto⎽⎽' 프로퍼티 내부에 다시 '⎽⎽proto⎽⎽' 프로퍼티가 연쇄적으로 이어진것을 프로토타입 체인이라 하고, 이 체인을 따라가며 검색하는 것을 프로토타입 체이닝이라고 한다.
→ 어떤 생성자 함수이든 prototype은 반드시 객체이기 때문에 Object.prototype이 언제나 프로토타입 체인의 최상단에 존재하게 된다.
출처 : 코어 자바스크립트(도서)
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes
https://www.zerocho.com/category/JavaScript/post/573c2acf91575c17008ad2fc