16.1. 내부 슬롯과 내부 메서드
- 내부 슬롯과 내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위한 의사 프로퍼티(pseudo property)와 의사 메서드(pseudo method)
- 의사 코드 / 메서드 : 프로그램 진행 과정을 인간의 언어로 간략히 설명해놓은 코드나 메서드
- 일반적으로 직접 접근할 수 있도록 공개된 객체의 프로퍼티는 아님
- 일부 내부 슬롯의 경우 __proto__ 를 통해 간접적으로 접근 가능
16.2. 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체
- 자바스크립트 엔진은 프로퍼티를 생성할 때 상태를 나타내는 프로퍼티 어트리뷰트를 기본 값으로 자동 정의함
- 프로퍼티 상태(=어트리뷰트): 값(value), 갱신 가능 여부(writable), 열거 가능 여부(enumerable), 재정의 가능 여부(configurable)
- 프로퍼티 상태에 직접 접근할 수는 없지만, Object.getownPropertyDescriptor 메서드가 반환하는 프로퍼티 디스크립터(PropertyDescriptor) 객체 참조 가능
16.3. 데이터 프로퍼티와 접근자 프로퍼티
16.3.1. 데이터 프로퍼티
- 데이터 프로퍼티(data property): 키와 값으로 구성된 일반적인 프로퍼티
- 데이터 프로퍼티의 상태(어트리뷰트)
- [[Value]] : 프로퍼티 값
- [[Writable]] : 변경 가능 여부 (boolean)
- [[Enumerable]] : 열거 가능 여부 (boolean)
- [[Configurable]] : 재정의 가능 여부 (boolean)
16.3.2. 접근자 프로퍼티
- 접근자 프로퍼티(accessor property)
- 자체 값을 가지지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할때 호출되는 접근자 함수로 구성된 프로퍼티
- getter/setter 함수라고도 함
- 접근자 프로퍼티의 상태(어트리뷰트)
- [[Get]] : getter, 프로퍼티 값 반환
- [[Set]] : setter, 프로퍼티 값 저장
- [[Enumerable]] : 데이터 프로퍼티와 같음
- [[Configurable]] : 데이터 프로퍼티와 같음
16.4. 프로퍼티 정의
- 새로운 프로퍼티를 추가하고, 어트리뷰트를 명시적으로 정의하는 것
- 기존 프로퍼티의 어트리뷰트를 재정의하는 것
- Object.defineProperty : 한 번에 하나의 프로퍼티 정의
- Object.defineProperties : 여러 개의 프로퍼티 한 번에 정의
16.5. 객체 변경 방지
- 객체는 재할당 없이 직접 변경할 수 있음
- 객체의 변경을 방지하는 다양한 메서드
- 객체 확장 금지: Object.preventExtensions
- 객체 밀봉: Object.seal
- 객체 동결: Object.freeze
16.5.1. 객체 확장 금지
- 객체의 프로퍼티 추가 금지
- Object.isExtensible : 확장 여부 확인
16.5.2. 객체 밀봉
- 프로퍼티 추가 및 삭제, 재정의 금지
- 읽기와 쓰기만 가능
- Object.isSealed : 밀봉 여부 확인
16.5.3. 객체 동결
- 프로퍼티 추가 및 삭제, 어트리뷰트 재정의, 값 갱신 금지
- 읽기만 가능
- Object.isFrozen : 동결 여부 확인
16.5.4. 불변 객체
- 불변 객체는 객체의 중첩 객체까지 동결하는 것
- 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드 호출
[출처] 모던 자바스크립트, Deep Dive