자바스크립트에서 객체는 매우 유연하기 때문에 의도하지 않은 변형이 있을 수 있다. 이때 객체를 보호하여 의도하지 않는 수정을 막는 방법이 존재한다.
- Object.freeze(obj); Object.isFrozen(obj);
- Object.seal(obj); Object.isSealed(obj);
- Object.preventExtensions(obj); Object.isExtensible(obj);
Object.freeze(obj)
이 메서드는 객체를 "동결"시킨다.
즉, 더이상 객체를 변경할 수 없게 되어 '숫자', '문자열'처럼 불변이 된다.
객채가 동결되었는지는 Object.isFrozen() 메서드로 알 수 있다.
구체적으로 다음과 같은 작업이 불가능해 진다.
- 프로퍼티 값 수정 또는 할당
- 프로퍼티 값을 수정하는 메서드 호출
- setter 호출
- 새 프로퍼티 추가
- 새 메서드 추가
- 기존 프로퍼티나 메서드의 설정 변경
Object.seal(obj)
이 메서드는 객체를 "봉인" 시킨다.
즉, 새 프로퍼티를 추가하거나 기존 프로퍼티를 변경 / 삭제 할 수 없다.
그러나 쓰기 가능한 속성의 값은 봉인 후에도 변경할 수 있다. (Object.freeze()와의 차이점)
객체가 봉인되었는지는 Object.isSealed(obj) 메서드로 알 수 있다.
Object.preventExtensions(obj)
이 메서드는 객체의 "확장을 금지" 시킨다.
즉, 새 프로퍼티를 추가하는 것만 금지된다. 프로퍼티에 값을 할당하거나, 삭제하거나, 속성을 변경하는 작업은 가능하다.
확장 금지 여부는 Object.isExtensible(obj) 메서드로 알 수 있다.
위 내용을 정리하면 다음과 같다.
동작 | 일반 객체 | 동결 객체 (freeze) | 봉인 객체 (sealed) | 확장 금지 객체 (prevent extension) |
프로퍼티 추가 | O | X | X | X |
프로퍼티 읽기 | O | O | O | O |
프로퍼티 값 설정 | O | X | O | O |
프로퍼티 속성 변경 | O | X | X | O |
프로퍼티 삭제 | O | X | X | O |
Object.freeze()
Object.freeze() 메서드는 객체를 동결합니다. 동결된 객체는 더 이상 변경될 수 없습니다. 즉, 동결된 객체는 새로운 속성을 추가하거나 존재하는 속성을 제거하는 것을 방지하며 존재하는 속성의 불변성, 설정 가능성(configurability), 작성 가능성이 변경되는 것을 방지하고, 존재하는 속성의 값이 변경되는 것도 방지합니다. 또한, 동결 객체는 그 프로토타입이 변경되는것도 방지합니다. freeze()는 전달된 동일한 객체를 반환합니다.
developer.mozilla.org
Object.seal()
Object.seal() 메서드는 객체를 밀봉합니다. 객체를 밀봉하면 그 객체에는 새로운 속성을 추가할 수 없고, 현재 존재하는 모든 속성을 설정 불가능 상태로 만들어줍니다. 하지만 쓰기 가능한 속성의 값은 밀봉 후에도 변경할 수 있습니다(역자 주 : 바로 이 점이 Object.freeze()와의 차이라고 할 수 있습니다).
developer.mozilla.org
Object.preventExtensions()
Object.preventExtensions() 메서드는 새로운 속성이 이제까지 객체에 추가되는 것을 방지합니다 (즉 객체의 장래 확장을 막습니다).
developer.mozilla.org