본문 바로가기

프로그래밍/Javascript

Javascript 객체 보호 : freeze(), seal(), preventExtensions()

반응형

자바스크립트에서 객체는 매우 유연하기 때문에 의도하지 않은 변형이 있을 수 있다. 이때 객체를 보호하여 의도하지 않는 수정을 막는 방법이 존재한다.

  • 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

반응형