[javascript] 프로퍼티 디스크립터 적용 시 상호작용 및 우선순위

자바스크립트에서는 프로퍼티 디스크립터를 사용하여 객체의 프로퍼티에 대한 속성을 정의할 수 있습니다. 이 디스크립터를 사용하면 프로퍼티의 값을 설정하거나, 읽기 전용으로 만들거나, 열거 가능한지 여부를 설정할 수 있습니다. 그러나 프로퍼티 디스크립터를 적용할 때에는 다른 프로퍼티 디스크립터와의 상호작용 및 우선순위를 고려해야 합니다.

상호작용

객체의 프로퍼티에는 value, writable, enumerable, configurable 이라는 네 가지 속성이 있습니다. 이 속성들은 프로퍼티 디스크립터를 통해 설정할 수 있으며, 서로 상호작용하는 경우가 있습니다.

  1. value와 writable: value 속성은 프로퍼티의 값을 나타내며, writable 속성은 값을 변경할 수 있는지 여부를 설정합니다. writable이 false로 설정되어 있으면, value 속성의 값을 변경할 수 없습니다.

  2. enumerable과 configurable: enumerable 속성은 for…in 루프 등을 통해 해당 프로퍼티가 열거 가능한지 여부를 설정합니다. configurable 속성은 해당 프로퍼티의 속성을 변경할 수 있는지 여부를 설정합니다. enumerable이 false로 설정되어 있으면, for…in 루프 등을 통해 해당 프로퍼티를 열거할 수 없습니다. configurable이 false로 설정되어 있으면, 디스크립터 값을 변경할 수 없습니다.

우선순위

프로퍼티 디스크립터를 적용할 때, 여러 속성이 함께 사용될 수 있습니다. 이때 우선순위에 따라 어떤 속성이 적용되는지를 결정합니다.

  1. writable과 value: writable이 true로 설정되어 있다면 value 속성의 값은 변경 가능합니다. writable이 false로 설정되어 있다면 value 속성의 값은 변경할 수 없습니다.

  2. configurable과 enumerable: configurable이 true로 설정되어 있다면 enumerable 속성의 값은 변경 가능합니다. configurable이 false로 설정되어 있다면 enumerable 속성의 값은 변경할 수 없습니다.

예제 코드

아래는 예제 코드입니다. Object.defineProperty() 메소드를 사용하여 객체의 프로퍼티 디스크립터를 설정할 수 있습니다.

const obj = {};

// value와 writable 예제
Object.defineProperty(obj, 'name', {
  value: 'John',
  writable: false
});

console.log(obj.name); // John
obj.name = 'Jane'; // 에러 발생
console.log(obj.name); // John

// enumerable과 configurable 예제
Object.defineProperty(obj, 'age', {
  value: 25,
  enumerable: false,
  configurable: false
});

console.log(obj.age); // 25
for (let key in obj) {
  console.log(key); // name만 출력됨
}

delete obj.age; // 에러 발생

위의 코드에서는 먼저 name 프로퍼티에 대한 디스크립터를 설정하고, writable을 false로 설정하여 값을 변경할 수 없도록 만듭니다. 이후 age 프로퍼티에 대한 디스크립터를 설정하고, enumerable과 configurable을 false로 설정하여 열거할 수 없고, 디스크립터 값을 변경할 수 없도록 만듭니다.

참고 자료