16.1 내부 슬롯과 내부 매서드

ECMAScript 사양에 등장하는 이중 대괄호([[…]]) 로 감싼 이름들이 내부 슬롯과 내부 메서드다.

내부 슬롯과 내부 메서드는 ECMAScript 사양에서 객체의 동작 방식을 설명하기 위해 사용되는 개념입니다. 이들은 자바스크립트 엔진 내부에서 실제로 객체의 동작을 구현하는데 사용됩니다. 하지만 이들은 개발자가 직접 접근하거나 조작할 수 있는 프로퍼티나 메소드가 아닙니다.

→ 원칙적으로 자바스크립트는 내부 슬롯과 내부 메서드에 직접적으로 접근하거나 호출할 수 있는 방법을 제공하지 않는다.

const o = {};

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

예를들어,모든객체는[[Prototype]]이라는내부슬롯을갖는다. 내부슬롯은 자바스크립트엔진의 내부 로직이므로 원칙적으로 직접 접근할 수 없지만 [[Prototype]] 내부슬롯의경우,__proto__를 통해 간접적으로 접근할 수 있다.

(하지만 [[Prototype]] 자체를 직접 조작하거나 접근하는 것은 불가능합니다.)

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

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

프로퍼티의 상태란?

프로퍼티의 값(value), 값의 갱신 가능 여부(writable), 열거 가능 여부(enumerable), 재 정의 가능 여부(configurable)를 말한다

const person = {
  name: 'Son',
};

// 프로퍼티 어트리뷰트 정보를 제공하는 프로퍼티 디스크립터 객체를 반환한다.
console.log(Object.getOwnPropertyDescriptor(person, 'name'));

// { value: 'Son', writable: true, enumerable: true, configurable: true }

Object.getOwnPropertyDescriptor() 호출할 때 첫 번째 매개변수에는 객체의 참조를 전달하고, 두 번째 매개변수에는 프로퍼티 키를 문자열로 전달한다.

Object.getOwnPropertyDescriptor() 프로퍼티 어트리뷰트 정보를 제공하는 프로퍼티 디스크립터 객체를 반환한다. 만약 존재하지 않는 프로퍼티나 상속받은 프로퍼티라면 undefined가 반환된다.

16.3 데이터 프로퍼티와 접근자 프로퍼티