반응형
* 프로퍼티 어트리뷰트가 어떤건지 모르면 프로퍼티 어트리뷰트가 뭔지 공부하고 이 글을 보는것이 더 좋을 것 같다.
* Typescript를 사용한다면 as const로 해결 할 수 있다.
객체 변경 방지
const로 정의한 객체는 메모리 주소를 할당하기 때문에, 변화가 가능한 값이다.
JS에서는 객체의 변경을 방지하는 다양한 메서드를 제공한다.
구분 | 메서드 | 프로퍼티 추가 | 프로퍼티 삭제 | 읽기 | 쓰기 | 재정의 |
객체 확장 금지 | Object.preventExtensions | x | o | o | o | o |
객체 밀봉 | Object.seal | x | x | o | o | x |
객체 동결 | Object.freeze | x | x | o | x | x |
객체 확장 금지 : Object.preventExtensions
const person = {name:'Lee'}
// 확장을 금지하여 프로퍼티 추가를 방지한다.
Object.preventExtensions(person)
person.age = 20;
console.log(person) // {name:'Lee'}, age 추가가 무시되었다.
delete person.name;
console.log(person) // {}, 삭제는 가능하다.
객체 밀봉 : Object.seal
const person = {name:'Lee'}
// 확장을 금지하여 프로퍼티 추가를 방지한다.
Object.seal(person)
person.age = 20;
console.log(person) // {name:'Lee'}, age 추가가 무시되었다.
delete person.name;
console.log(person) // {name:'Lee'}, 삭제도 금지된다.
person.name = 'Kim'
console.log(person) // {name:'Kim'}, 갱신은 가능하다.
// 프로퍼티 어트리뷰트 재정의 금지
// VM351:1 Uncaught TypeError: Cannot define property name, object is not extensible
Object.defineProperty(person, 'name', {configurable:true})
객체 동결 : Object.freeze
const person = {name:'Lee'}
// 확장을 금지하여 프로퍼티 추가를 방지한다.
Object.seal(person)
person.age = 20;
console.log(person) // {name:'Lee'}, age 추가가 무시되었다.
delete person.name;
console.log(person) // {name:'Lee'}, 삭제도 금지된다.
person.name = 'Kim'
console.log(person) // {name:'Lee'}, 갱신도 금지된다.
// 프로퍼티 어트리뷰트 재정의 금지
// VM351:1 Uncaught TypeError: Cannot define property name, object is not extensible
Object.defineProperty(person, 'name', {configurable:true})
불변 객체
위 3가지 변경 방지 메서드는 얕은 변경 방지라서 1depth까지만 동작하고 2depth이후 중첩된 객체까지는 영향을 주지 못한다.
객체의 중첩 객체까지 동결하려면 재귀적으로 모든 프로퍼티에 대해 Object.freeze메서드를 호출해야 한다.
반응형
'개발 > Javascript' 카테고리의 다른 글
자바스크립트 엔진과 자바스크립트 런타임 차이 읽고 정리 (0) | 2024.08.15 |
---|---|
렉시컬환경과 클로저, 그리고 React에서 이전 state를 기억하는 방식 (0) | 2023.12.16 |
onClick과 onMousedown의 차이 (0) | 2023.11.21 |
모달과 이벤트 버블링 (0) | 2023.09.12 |
문자열에서 특정 인덱스를 추출할때 charAt과 숫자인덱싱의 차이 (0) | 2023.05.17 |