16.1 내부 슬롯과 내부 메서드
ECMAScript의 이중 대괄호로 감싼 이름들이 내부 슬롯(pesudo propery)과 내부 메서드(pesudo method)다. 단 이는 개발자가 직접 접근할 수 있도록 외부에 공개된 객체 프로퍼티는 아니지만, 일부 는 접근할 수 있다.
const o = {};
// 내부 슬롯은 직접 접근할 수 없다.
p.[[Prototype]] // Uncaught SyntaxError: Unexpected token '['
// 단, 일부는 접근할 수 있다.
o.__proto__
JavaScript
복사
16.2 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체
JS는 프로퍼티 생성시 프로퍼티의 상태를 나타내는 기본값들을 자동으로 정의한다. 프로퍼티의 상태는 값, 값 갱신여부, 열거 가능 여부, 재저으이 가능 여부를 말한다. 이는 Object.getOwnPropertyDescriptor 매서드를 사용하여 간접적으로 확인할 수는 있다. Object.getOwnPropertyDescriptor 메서드를 호출할 때 첫 번째 매개변수는 객체의 참조, 두번재는 프로퍼티 키를 문자열로 전달합니다. 이는 프로퍼티 디스크립터 객체를 반환합니다.
const a = { name: 'bbb' };
a.age = 20;
console.log(Object.getOwnPropertyDescriptor(a, 'name'));
// VM338:3 {value: 'bbb', writable: true, enumerable: true, configurable: true}
JavaScript
복사
16.3 데이터 프로퍼티와 접근자 프로퍼티
데이터 프로퍼티 : 키와 값으로 구성된 일반적인 프로퍼티
접근자 프로퍼티 : 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의값을 읽거나 저장할 때 호출되는 접근자 함수로 구성된 프로퍼티
16.3.1 데이터 프로퍼티
Property attribute | Property Descriptor Object’s Property | Description |
[[Value]] | value | 프로퍼티 키를 통해 값에 접근 시 반환값
프로퍼티 키를 통해 값을 변경 시 [[value]] 값을 재할당 |
[[Writable]] | writable | 값의 변경 여부 |
[[Enumerable]] | enumerable | 열거 가능 여부 |
[[Configurable]] | configurable | 재정의 가능 여부 |
16.3.2 접근자 프로퍼티
접근자 프로퍼티는 자체적으로 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티입니다.
Property attribute | Property Descriptor Object’s Property | Description |
[[Get]] | get | 접근자 프로퍼티를 통해 데이터 프로퍼티의 값을 읽을 때 호출되는 접근자 함수 |
[[Set]] | set | 접근자 프로퍼티를 통해 값을 젖아할 때 호출되는 함수 |
[[Enumerable]] | enumerable | 열거 가능 여부 |
[[Configurable]] | configurable | 재정의 가능 여부 |
자체적으로는 값을 가지지 않으며, 값을 읽거나 저장할때만 쓰인다.
Get의 경우 아래와 같이 동작한다.
1.
프로퍼티 키 유혀 여부 확인
2.
프로토타입 체인에서 프로퍼티 검색
3.
해당 프로퍼티가 접근자 프로퍼티여부 확인
4.
get을 호출하여 결과 반환
16.4 프로퍼티 정의
Object.definePropery 메서드를 통해서 새로운 프로퍼티를 추가하면서 명시적으로 정의하거나, 기존을 재정의할 수 있다. 이때 디스크립터 객체의 프로퍼티를 일부 생략할 수 있다.
Property Descriptor Object’s Property | 대응하는 Property Attribute | default value |
value | [[Value]] | undefined |
get | [[Get]] | undefined |
set | [[Set]] | undefined |
writable | [[Writable]] | false |
enumerable | [[Enumerable]] | false |
configurable | [[Configurable]] | false |
16.5 객체 변경 반지
JS는 객체 변경을 방지하는 다양한 메서드를 제공한다.
16.5.1 객체 확장 금지
Object.preventExtensions 메서드는 객체의 확장을 금지하는데 이때 프포퍼티의 추가가 막힌다. 이에 대한여부는 Object.isExtensible 메서드로 확인 가능하다.
const a = { name: 'b'};
console.log(Object.isExtensible(a)); // VM53472:2 true
Object.preventExtensions(a);
console.log(Object.isExtensible(a)); // VM53472:4 false
JavaScript
복사
16.5.2 객체 밀봉
Object.seal 메서드는 객체의 읽기와 쓰기만 가능하도록 하며 Object.isSealed 메서드로 확인 가능하다.
const a = { name: 'b'};
console.log(Object.isSealed(a)); // VM53643:4 false
Object.seal(a);
console.log(Object.isSealed(a)); //VM53643:8 true
JavaScript
복사
16.5.3 객체 동결
Object.freeze는 객체를 동결시켜 읽기만 가능하도록하며 isFrozen메서드로 확인할 수 있다.
16.5.4 불변 객체
지금까지 변경 방지 메서드들은 얕은 병견 방지로 직속 프로퍼티만 가능하고 중첩 객체는 영향 끼치 못한다.