내부 슬롯과 내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티pseudo property
와 의사 메서드pseudo method
다.ECAMScript 사양에 등장하는 이중 대괄호 [[...]]
로 감싼 이름들이 내부 슬롯과 내부 메서드다.
내부 슬롯으로 직접적인 접근은 불가능하다. [[Prototyp]]
의 경우 __proto__
를 통해 간접적으로 접근가능하다.
const o = {};
// 내부 슬롯은 자바스크립트 엔진의 내부 로직이므로 직접 접근할 수 없다.
o.[[Prototype]] // -> Uncaught SyntaxError: Unexpected token '['
// 단, 일부 내부 슬롯과 내부 메서드에 한하여 간접적으로 접근할 수 있는 수단을 제공하기는 한다.
o.__proto__ // -> Object.prototype
자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰터를 기본값으로 자동 정의한다.
value
[[Value]]
writable
[[Writable]]
enumerable
[[Enumerable]]
configurable
[[Configurable]]
이름 | 설명 |
---|---|
프로퍼티 어트리뷰트 | 프로퍼티의 상태를 나타내는 내부 슬롯들 |
프로퍼티 디스크립터 | 프로퍼티의 어트리뷰트 정보를 제공하는 객체 |
프로퍼티 어트리뷰트를 확인하기 위해서는 Object.getOwnPropertyDescriptor
메서드를 사용해 간접적으로 확인할 수 있다.
const person = {
name: 'Lee'
};
// 프로퍼티 어트리뷰트 정보를 제공하는 프로퍼티 디스크립터 객체를 반환한다.
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
// {value: "Lee", writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor
메서드는 하나의 프로퍼티에 대한 정보만 볼 수 있고 프로퍼티 디스크립터Property Descriptor
객체를 반환한다. 만약 존재하지 않으면 undefined
가 반환된다.Object.getOwnPropertyDescriptor
는 하나의 프로퍼티에 대한 결과만 반환하지만 ES8에 추가된 Object.getOwnPropertyDescriptors
메서드는 객체의 모든 프로퍼티 어트리뷰트정보를 제공하는 프로퍼티 디스크립터 객체들을 반환한다.
const person = {
name: 'Lee'
};
// 프로퍼티 동적 생성
person.age = 20;
// 모든 프로퍼티의 프로퍼티 어트리뷰트 정보를 제공하는 프로퍼티 디스크립터 객체들을 반환한다.
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
name: {value: "Lee", writable: true, enumerable: true, configurable: true},
age: {value: 20, writable: true, enumerable: true, configurable: true}
}
*/