console.dir()
메소드를 활용하면, [[Prototype]]
이라는 숨어있는 속성을 확인할 수 있다.[[Prototype]]
은 해당 객체의 입장에서 자신의 부모 역할을 하는 객체를 가리킨다.[[Prototype]]
, .__proto__
, .prototype
알아보기[[Prototype]]
개발자가 직접 접근이 불가하고 간접적으로 접근할 수 있는 내부 슬롯(internal slot)
internal slot
자바스크립트 엔진의 구현된 내용을 설명하기 위한 pseudo 프로퍼티
직접 접근을 불가하게 해서 프로토타입 체인의 방향을 자식에서 부모를 탐색하는 단방향으로 지키고, 실수로 순환참조하는 일이 없도록 한다.
function Person(name) {
this.name = name;
}
console.dir(Person);
__proto__
객체의 프로토타입([[Prototype]]
)을 접근하기 위한 프로퍼티
이를 통해 자신의 프로토타입에 접근할 수 있다.
Object.getPrototypeOf()
와 동일한 기능을 수행한다.
function Person(name) {
this.name = name;
}
console.log(Person.__proto__ === Object.getPrototypeOf(Person)); // true
prototype
생성자 함수로 호출할 수 있는 객체, 즉 constructor
를 소유하는 프로퍼티
Person()
생성자 함수로 foo
를 만들었다면, foo
객체를 생성한 객체는 Person()
생성자 함수이므로, foo
객체의 프로토타입 객체는 Person()
의 생성자 함수, Person.prototype
이다
일반 객체와 생성자 함수로 호출할 수 없는 arrow function은 prototype
프로퍼티가 없다.
function Person(name) {
this.name = name;
}
const foo = new Person('코드잇');
console.log(foo.__proto__ === Person.prototype); // true
console.log(Person.prototype) // {constructor: f}
자바스크립트는 특정 객체의 프로퍼티나 메소드에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티나 메소드가 없다면 프로토타입([[Prototype]]
)이 가리키는 링크를 따라 자신의 부모 역할을 하는 프로토타입 객체의 프로퍼티나 메소드를 차례대로 검색한다.
프로토타입 링크를 따라 계속해서 상위 프로토타입을 검색할 수 있고, 이러한 프로토타입 간의 연결을 프로토타입 체인이라고 한다.
프로토타입을 계속해서 타고가면 자바스크립트의 모든 객체는 Object.prototype
에 최종 도착한다.
function Person(name) {
this.name = name;
}
const foo = new Person('코드잇');
const string = 'abc';
const number = 123;
const array = [1,2,3];
const arrowFunction = () => 'arrowFunction';
const object = {a: 'abc'};
console.log(foo.__proto__ === Person.prototype); // true
console.log(string.__proto__ === String.prototype); // true
console.log(number.__proto__ === Number.prototype); // true
console.log(array.__proto__ === Array.prototype); // true
console.log(arrowFunction.__proto__ === Function.prototype); // true
console.log(foo.__proto__.__proto__ === Object.prototype); // true
console.log(string.__proto__.__proto__ === Object.prototype); // true
console.log(number.__proto__.__proto__ === Object.prototype); // true
console.log(array.__proto__.__proto__ === Object.prototype); // true
console.log(arrowFunction.__proto__.__proto__ === Object.prototype); // true
console.log(object.__proto__ === Object.prototype); // true
Object.prototype
에는 모든 객체에서 사용할 수 있는 메소드가 정의되어 있다.
참고 자료