[javascript] 프로퍼티 디스크립터 수정 시의 주의사항

자바스크립트에서는 객체의 프로퍼티 디스크립터를 수정하여 프로퍼티의 동작을 변경할 수 있습니다. 하지만 이러한 수정은 주의를 요합니다. 이번 포스트에서는 프로퍼티 디스크립터 수정 시에 주의해야 할 사항들에 대해 알아보겠습니다.

1. 쓰기 가능한(writable) 속성

프로퍼티 디스크립터의 writable 속성은 프로퍼티의 값을 변경할 수 있는지 여부를 결정합니다. 이 값을 false로 설정하면 해당 프로퍼티의 값을 변경할 수 없습니다. 하지만 이 속성을 임의로 수정할 경우, 에러가 발생하지 않고 디스크립터가 무시되는 현상이 발생할 수 있습니다.

const obj = {
  foo: 42
};

Object.defineProperty(obj, 'foo', {
  writable: false
});

obj.foo = 24; // 에러가 발생하지 않고 무시됨
console.log(obj.foo); // 42

2. 열거 가능한(enumerable) 속성

프로퍼티 디스크립터의 enumerable 속성은 프로퍼티가 for…in 루프 등을 통해 열거 가능한지 여부를 결정합니다. 일반적으로 이 값을 false로 설정하면 해당 프로퍼티가 열거되지 않습니다. 하지만 이 속성을 수정하면 프로퍼티의 열거 가능 여부에 영향을 줄 수 있습니다.

const obj = {
  foo: 42
};

Object.defineProperty(obj, 'foo', {
  enumerable: false
});

for (let key in obj) {
  console.log(key); // 아무 것도 출력되지 않음
}

3. 설정 가능한(configurable) 속성

프로퍼티 디스크립터의 configurable 속성은 프로퍼티 디스크립터 자체를 수정할 수 있는지 여부를 결정합니다. 일반적으로 이 값을 false로 설정하면 해당 프로퍼티의 디스크립터를 수정할 수 없습니다. 하지만 이 속성을 수정하면 프로퍼티의 동작에 영향을 줄 수 있습니다.

const obj = {
  foo: 42
};

Object.defineProperty(obj, 'foo', {
  configurable: false
});

Object.defineProperty(obj, 'foo', {
  writable: true // 에러가 발생함
});

console.log(obj.foo);

이러한 주의사항들을 염두에 두고 프로퍼티 디스크립터를 수정해야 합니다. 잘못된 수정은 예상치 못한 동작이나 에러를 발생시킬 수 있으므로 주의가 필요합니다.

참고 자료