자바스크립트는 프로토타입 기반 언어다. 클래스 기반 언어에서는 상속을 사용하지만 프로토타입 기반 언어에서는 어떤 객체를 원형으로 삼고 이를 복제함을써 상속과 비슷한 효과를 얻는다.
먼저 자바스크립트의 프로토타입은 다음과 같다.
let instance = new Constructor();
위 코드를 해석하면 다음과 같다
생성자 함수의 prototype에 어떤 메서드나 프로퍼티가 있다면 인스턴스에서도 마치 자신의 것 처럼 해당 메서드나 프로퍼티에 접근이 가능해진다.
즉 Constructor.property와 instance.__proto__는 같은거라고 생각하면 된다.
생성자 함수의 프로퍼티인 prototype 객체 내부에는 constructor 라는 프로퍼티가 있다.
이건 instance의 __proto__ 객체 내부에도 마찬가지다.
이 constructor 라는 프로퍼티는 말 그대로 원래의 생성자 함수(자기 자신)를 참조한다.
let arr = [1,2];
Array.prototype.constructor === Array // true
arr.__proto__.constructor === Array // true
arr.constructor === Array // true
let arr2 = new arr.constructor(3,4);
console.log(arr2); // [3,4]
인스턴스의 __proto__ 가 생성자 함수의 prototype. 프로퍼티를 참조하며 __proto__ 가 생략 가능하기 때문에 인스턴스에서 직접 constructor에 접근할 수 있는 수단이 생긴것이다.
그냥 자신의 생성자 함수가 무엇인지 찾게 해주는 용도다.
우리가 콘솔창에 어떠한 값을 불러오면
저렇게 [[Prototype]]을 클릭해 펼치면 끝없이 나오는 위 이미지와 같은 코드들을 볼 수 있을 것이다.
잘 보면 bind 나 entries, call 등의 메서드들을 볼 수 있을 것 이다.
우리가 평소에 무심코 사용하던 메서드들이 사실 객체 안에 무수한 프로퍼티와 메서드로 존재한다는 뜻이 된다.
아무튼 어떤 데이터의 __proto__프로퍼티 내부에 다시 __proto__ 프로퍼티가 연쇄적으로 이어진 것을 프로토타입 체인이라고 하고, 이 체인을 따라가면서 검색하는것을 프로토타입 체이닝이라고 한다.