상세 컨텐츠

본문 제목

[자바스크립트] 왜 Object.create()로 객체를 만들때 프로퍼티가 inwritable로 되는가?

카테고리 없음

by esoesmio 2023. 5. 17. 11:04

본문

JavaScript의 Object.create() 메소드를 사용하여 객체를 생성할 때, 두 번째 인수로 속성 설명자를 전달할 수 있습니다. 이 속성 설명자는 객체의 속성을 보다 상세하게 정의할 수 있습니다.

속성 설명자에는 value, writable, enumerable, configurable 등의 속성이 있습니다.

value는 속성의 값을 설정합니다.
writable은 속성의 값을 변경할 수 있는지 여부를 설정합니다. 기본값은 false입니다.
enumerable은 속성이 for...in 루프나 Object.keys() 등에 의해 열거될 수 있는지 여부를 설정합니다. 기본값은 false입니다.
configurable은 속성을 삭제하거나 속성의 속성을 변경할 수 있는지 여부를 설정합니다. 기본값은 false입니다.
위 코드에서 o = Object.create({}, { p: { value: 42 } });는 o 객체에 p라는 속성을 추가하며, 그 값은 42로 설정됩니다. 그러나 writable 속성은 명시적으로 설정되지 않았으므로 기본값인 false가 적용됩니다.

따라서 o.p = 24;라는 코드를 실행하려고 하면, p 속성이 writable: false 상태이므로 속성 값이 변경되지 않습니다. 그래서 o.p를 출력하면 처음에 설정했던 값인 42가 출력됩니다.

p 속성의 값을 변경하려면 writable 속성을 true로 설정해야 합니다:

javascript
Copy code
let o = Object.create({}, { 
  p: { 
    value: 42,
    writable: true
  } 
});

o.p = 24;
console.log(o.p);  // 출력: 24
이 코드를 실행하면 p 속성의 값을 변경할 수 있으므로 24가 출력됩니다.





User
 let a = {b:3, z:6};
console.log(a.b=163);
console.log(a.b); 근데 이거는 writable의 기본값이 false가 아니고 true인데? 너는 왜 기본값이 false라고했어?
ChatGPT
죄송합니다, 제가 혼동을 드렸네요. JavaScript에서 객체를 일반적인 방식으로 생성하고 속성을 할당할 때, writable, enumerable, configurable 속성은 모두 기본적으로 true로 설정됩니다.

javascript
Copy code
let a = {b: 3, z: 6};
console.log(a.b = 163);  // 출력: 163
console.log(a.b);  // 출력: 163
위 코드에서 a.b = 163; 는 a 객체의 b 속성의 값을 163으로 변경합니다. b 속성은 writable: true로 설정되어 있으므로 값을 변경할 수 있습니다.

그러나 Object.create()의 두 번째 인수로 속성 설명자를 전달하는 경우, 속성 설명자에 명시적으로 설정하지 않은 writable, enumerable, configurable 속성은 기본적으로 false로 설정됩니다.

javascript
Copy code
let o = Object.create({}, { p: { value: 42 } });
console.log(o.p = 24);  // 에러: Cannot assign to read only property 'p' of object '#<Object>'
console.log(o.p);  // 출력: 42
위 코드에서 o.p = 24;는 o 객체의 p 속성의 값을 변경하려고 시도합니다. 그러나 p 속성은 Object.create()를 사용하여 생성되었고, writable 속성이 명시적으로 true로 설정되지 않았으므로 writable: false가 기본값으로 적용되어 값을 변경할 수 없습니다.

댓글 영역