자바스크립트의 객체의 프로퍼티는 key-value 쌍 외에도, 추가 구성 옵션을 가지고 있습니다.
객체 프로퍼티의 추가 구성 옵션에 대해 알아봅니다.
객체 프로퍼티는 값(value)와 함께 세 가지의 플래그(flag)를 가지고 있습니다.
세 가지의 플래그는 평범한 방식으로 만들면, 모두 true로 설정됩니다.
let descriptor = Object.getOwnPropertyDescriptor(obj, propertyName);
/*
{
value
}
*/
객체와 프로퍼티 명을 인자로, 설명자를 얻을 수 있습니다.
설명자에는 프로퍼티의 값과 세 플래그에 대한 정보가 담겨 있습니다.
Object.defineProperty(obj, propertyName, descriptor);
객체와 프로퍼티 명, 적용하는 설명자를 인자로 설명자를 정의합니다.
defineProperty 메서드는 프로퍼티가 있다면 해당 설명자로 변경해주고,
없다면 새로운 프로퍼티를 만들어줍니다.
만약, 플래그 정보가 설명자에 없다면 플래그의 값은 false가 됩니다.
let obj = {
age : 23,
}
Object.defineProperty(obj, 'name', {value:'yuno'});
// flag : false
//writable : false
obj.name = 'change' // err (use strict)
//enumable : false
for(let key in obj) {
console.log(key) // age
}
//configurable : false
delete obj.name; // err
구성 가능함을 나타내는 플래그 configurable가 false 라면 다음과 같은 제약사항을 갖습니다.
이처럼, configurable 플래그를 수정할 수 없기에 한번 configurable이 false로 설정하면,
다시 defineProperty를 사용해도 true로 바꿀 수 없습니다.
이러한 특징으로 영원히 수정할 수 없는 프로퍼티를 만들 수 있습니다.
몇몇 내장객체의 프로퍼티들은 configurable:false가 설정되어 있습니다.
Math.PI가 대표적인 예입니다. 이 프로퍼티는 쓰기, 열거, 구성이 불가합니다.
프로퍼티 여러개를 한번에 정의할 수 있습니다.
Object.definedProperties(obj, {
props1 : decriptor1,
props2 : decriptor2,
})
객체의 프로퍼티 설명자를 전부 얻을 수 있습니다.
Object.definedProperties와 함께 사용하면, 플래그 까지 복사할 수 있습니다.
let clone = Object.definedProperties(obj,Object.getOwnPropertyDescriptors(obj));