16장 프로퍼티 어트리뷰트

어트리뷰트를 이해하기 위해선 먼저 내부 슬롯(internal slot)과 내부 메서드(internal method) 개념에 대해 알아야 한다.

내부 슬롯과 내부 메서드는 자바스크립트 엔진을 설명하기 위해 ECMAScript스펙에서 사용하는 의사 프로퍼티와 의사 메서드이다. 엔진 스펙에서 이중 대괄호([[…]])로 감싼게 모두 내부 슬롯과 내부 메서드이다.

내부 슬롯과 내부 메서드는 사양에 정의된 대로 실제로 동작하지만 개발자가 직접 접근할순 없다. (객체에 대한 메타 정보라고 생각하면 된다, 이 스펙을 어떻게 구현하냐는 JS엔진 벤더사에 달려있다. 굳이 이 내부까지 알 필요는 없음)

일부 내부 슬롯이나 내부 메서드에 한하여 간접적으로 접근할 수 있다.

예를 들어 모든 객체는 [[Prototype]]이라는 내부 슬롯을 갖는다. 이 경우 __proto__를 통해 간접적으로 접근할 수 있다.

const o = {};

console.log(o.__proto__);

Untitled

💡 참고로 이 __proto__ 는 원래 표준 사양이 아니다. de Facto였고 브라우저들이 그냥 지원하던건데 ES6에서 표준으로 넣어줬다. 그러나 Deprecated임. 쓰지 말고 프로퍼티 디스크립터를 쓰자.

정체는 모든 객체가 갖는 내부슬롯인 [[Prototype]]에 접근할 수 있게 해주는 접근자 프로퍼티이다.

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

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

프로퍼티의 상태란 다음의 네가지를 말한다.

  1. 프로퍼티의 값
  2. 값의 갱신가능여부(writable)
  3. 열거 가능여부(enumerable)
  4. 재 정의 가능 여부(configurable)