__proto__를 통해 간접적 접근 가능자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의
const person = {
name: 'Lee'
};
// 프로퍼티 동적 생성
person.age = 20;
// 모든 프로퍼티의 프로퍼티 어트리뷰트 정보를 제공하는
// 프로퍼티 디스크립터 객체들을 반환
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
age: {value: 20, writable: true, enumerable: true, configurable: true}
name: {value: 'Lee', writable: true, enumerable: true, configurable: true}
}
*/
프로퍼티 어트리뷰트는 자바스크립트 엔진이 프로퍼티를 생성할 때 기본값으로 자동 정의
| 프로퍼티 어트리뷰트 | 프로퍼티 디스크립터 객체의 프로퍼티 | 설명 |
|---|---|---|
| [[Value]] | value | - 키를 통해 값에 접근하면 반환되는 값 - 키를 통해 프로퍼티 값을 변경하면 값을 재할당 |
| [[Writable]] | writable | - 값의 변경 가능 여부를 나타내며 불리언 값을 가짐 - false인 경우 해당 프로퍼티의 값을 변경할 수 없는 읽기 전용이 됨 |
| [[Enumerable]] | enumerable | - 프로퍼티의 열거 가능 여부를 나타내며 불리언 값을 가짐 - false인 경우 해당 프로퍼티는 for ...in 문이나 Object.keys 메서드 등으로 열거할 수 없음 |
| [[Configurable]] | configurable | - 프로퍼티의 재정의 가능 여부를 나타내며 불리언 값을 가짐 - false인 경우 해당 프로퍼티의 삭제, 어트리뷰트 값의 변경이 금지됨 - [[Writable]]이 true인 경우 [[Value]]의 변경과 [[Writable]]을 false로 변경하는 것은 허용됨 |
| 프로퍼티 어트리뷰트 | 프로퍼티 디스크립터 객체의 프로퍼티 | 설명 |
|---|---|---|
| [[Get]] | get | - 접근자 프로퍼티를 통해 프로퍼티의 값을 읽을 때 호출되는 접근자 함수 - getter 함수가 호출되고 그 결과가 프로퍼티 값으로 반환됨 |
| [[Set]] | set | - 접근자 프로퍼티를 통해 프로퍼티의 값을 저장할 때 호출되는 접근자 함수 - setter 함수가 호출되고 그 결과가 프로퍼티 값으로 반환됨 |
| [[Enumerable]] | enumerable | 데이터 프로퍼티와 같음 |
| [[Configurable]] | configurable | 데이터 프로퍼티와 같음 |
프로퍼티 정의
= Object.defineProperty 메서드를 사용하면 프로퍼티의 어트리뷰트 정의 가능
= 새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나, 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것
| 프로퍼티 디스크립터 객체의 프로퍼티 | 대응하는 프로퍼티 어트리뷰트 | 생략했을 때의 기본값 |
|---|---|---|
| value | [[Value]] | undefined |
| get | [[Get]] | undefined |
| set | [[Set]] | undefined |
| writable | [[Writable]] | false |
| enumerable | [[Enumerable]] | false |
| configurable | [[Configurable]] | false |
객체는 변경 가능한 값이므로 재할당 없이 직접 변경 가능
= 프로퍼티를 추가하거나 삭제할 수 있고, 프로퍼티 값 갱신 가능
= Object.defineProperty 또는 Object.defineProperties 메서드를 사용하여 프로퍼티 어트리뷰트 재정의 가능
| 구분 | 메서드 | 프로퍼티 추가 | 프로퍼티 삭제 | 프로퍼티 값 읽기 | 프로퍼티 값 쓰기 | 프로퍼티 어트리뷰트 재정의 |
|---|---|---|---|---|---|---|
| 객체 확장 금지 | Object.preventExtensions (Object.isExtensible로 확인) | x | o | o | o | o |
| 객체 밀봉 | Object.seal (Object.isSealed으로 확인) | x | x | o | o | x |
| 객체 동결 | Object.freeze (Object.isFrozen으로 확인) | x | x | o | x | x |