1. 내부 슬롯과 내부 메서드

내부 슬롯과 내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티pseudo property와 의사 메서드pseudo method다.ECAMScript 사양에 등장하는 이중 대괄호 [[...]]로 감싼 이름들이 내부 슬롯과 내부 메서드다.

내부 슬롯으로 직접적인 접근은 불가능하다. [[Prototyp]]의 경우 __proto__를 통해 간접적으로 접근가능하다.

const o = {};

// 내부 슬롯은 자바스크립트 엔진의 내부 로직이므로 직접 접근할 수 없다.
o.[[Prototype]] // -> Uncaught SyntaxError: Unexpected token '['
// 단, 일부 내부 슬롯과 내부 메서드에 한하여 간접적으로 접근할 수 있는 수단을 제공하기는 한다.
o.__proto__ // -> Object.prototype

2. 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체

자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰터를 기본값으로 자동 정의한다.

이름 설명
프로퍼티 어트리뷰트 프로퍼티의 상태를 나타내는 내부 슬롯들
프로퍼티 디스크립터 프로퍼티의 어트리뷰트 정보를 제공하는 객체

프로퍼티 어트리뷰트를 확인하기 위해서는 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}
}
*/

3. 데이터 프로퍼티와 접근자 프로퍼티