자바스크립트 엔진은 property
를 생성할때 해당 property의 상태를 나타내는 property attribute
를 default값으로 자동 정의합니다.
여기서 property의 상태는 아래와 같은 구성요소가 있습니다.
property attribute는 내부슬롯입니다. 따라서 이 값들에는 직접 접근 할 수 없습니다.
🔎 내부 슬롯이란?
내부 슬롯/내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티/의사 메서드입니다.
내부 슬롯/내부 메서드는 정의된 대로자바스크립트 엔진
에서 실제로 동작하지만,개발자
가 직접 접근하거나 호출 할 수 있는 방법은 제공되지 않습니다.
하지만 일부 내부 슬롯/내부 메서드에 한해서 간접적으로 접근 할 수 있는 수단을 제공합니다.객체
의 [[Prototype]]이라는 내부 슬롯에 proto를 통해 간접적으로 접근가능한데 이가 대표적이 예 입니다.
위에서 언급했듯이 내부 슬롯에는 직접 접근 할 수 없습니다. 그런데 Property Attribute 내부슬롯에는 간접적으로 접근 할 수 있는 방법이 제공됩니다. 그 방법은 바로 Object.getOwnPropertyDescriptor입니다.
ES8부터 Object.getOwnPropertyDescriptors가 도입되었는데, 이는 두번째 파라미터 값을 넘기지 않고 호출되며, 해당 객체의 모든 프로퍼티의 Attributer정보를 제공합니다.
Property Descriptor 객체를 반환합니다.
만약 존재하지 않는 또는 상속받은 프로퍼티를 넘기면 undefined가 반환됩니다.
const person = {
name: 'Lee';
age = 20;
}
console.log(person.getOwnPropertyDescriptor(person));
/*
{
name: {value: 'Lee', writable: true, enumerable: true, configurable: ture},
age: {value: 20, writable: true, enumerable: true, configurable: ture},
}
*/
Property는 데이터 Property, 접근자 Property 두가지의 종류가 있습니다.
접근자 함수
로 구성된 프로퍼티어트리뷰트 이름 | 설명 |
---|---|
[[Value]] | 프로퍼티에 저장된 실제 값(키를 통해 접근했을때 반환되는 값) 만약 property가 변경되면 [[Value]] 에 재할당이 이뤄진다. |
[[Writable]] | 프로퍼티의 값이 변경 가능한지 여부를 나타냄. true 면 변경 가능, false 면 읽기 전용 |
[[Enumerable]] | 프로퍼티가 for...in 루프나 Object.keys() 등의 열거 가능한지 여부를 나타냄. true 면 열거 가능, false 면 열거 불가능 |
[[Configurable]] | 프로퍼티의 재정의 가능 여부를 나타냄, true 면 변경 가능, false 면 변경 불가능 |
🔍Configurable 는 프로퍼티의 재정의 가능 여부를 나타내는 값인데 여기서 프로퍼티의 재정의란 아래를 의미합니다.
1. 프로퍼티의 삭제
2. 프로퍼티 어트리뷰트 값의 변경
🚫 이때, 만약 Writable가 ture인 경우에는, Configurable가 false이더라도 Writable의 값을 ture로 변경가능할까요..?
어트리뷰트 이름 | 설명 |
---|---|
[[GET]] | 만약 접근자 property key에 접근하면 getter가 호출되고 그 결과가 프로퍼티 값으로 반환된다. |
[[SET]] | 만약 접근자 property key에 저장하면 setter가 호출되고 그 결과가 프로퍼티 값으로 반환된다. |
[[Enumerable]] | 데이터 property와 같음 |
[[Configurable]] | 데이터 property와 같음 |