이 번역은 완료되지 않았습니다. 이 문서를 번역해 주세요.

Object.freeze() 메서드는 객체를 동결합니다. 동결된 객체는 변경할 수 없습니다. 즉 새로운 속성을 추가할 수 없고, 기존 속성을 제거하거나 열거, 설정, 쓰기 가능 여부를 바꿀 수 없고, 기존 속성의 값도 변경할 수 없으며 프로토타입의 변경도 방지합니다.

구문

Object.freeze(obj)

매개변수

obj
동결할 객체.

반환 값

동결된 obj.

설명

동결 객체의 속성 집합에는 어떠한 것도 추가하거나 제거할 수 없습니다. 속성 변경에 대한 모든 시도는 실패합니다. 실패는 조용히 넘어가거나, TypeError 예외를 던집니다. 예외는 전부는 아니지만 주로 엄격 모드에서 발생합니다.

동결 객체가 가진 데이터 속성에 대해선, 값을 변경할 수 없으며 설정 가능 여부와 쓰기 가능 여부 속성 모두 거짓이 됩니다. 접근자 속성(접근자getter와 설정자setter) 역시 마찬가지이지만, 설정자로 값을 변경할 때 오류가 발생하지 않으므로 마치 값이 바뀐 것처럼 느낄 수는 있으며 실제로는 아무 변화도 없습니다. 그러나 속성의 값이 객체라면, 그 값 객체는 동결하기 전까지 변경할 수 있습니다. 배열도 객체이므로 동결할 수 있습니다. 동결 배열의 원소는 변형할 수 없고, 원소를 추가하거나 제거할 수 없습니다.

freeze는 함수에 전달한 객체를 그대로 반환하며, 동결한 별도의 복사본을 만들지 않습니다.

예제

객체 동결하기

var obj = {
  prop: function() {},
  foo: 'bar'
};

// 새 속성을 추가할 수 있고,
// 기존 속성을 변경하거나 제거할 수 있음
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

// 인자로 제공한 객체와 반환값 모두 동결 객체
// 원본 객체를 동결하려고 새로운 변수에 반환값을
// 저장할 필요는 없음.
var o = Object.freeze(obj);

o === obj; // true
Object.isFrozen(obj); // true

// 이제 모든 변경 시도는 실패
obj.foo = 'quux'; // 조용히 실패, 값 변경 안함
// 조용히 실패, 속성 추가 안함
obj.quaxxor = 'the friendly duck';

// 엄격 모드에서는 TypeError 발생
function fail(){
  'use strict';
  obj.foo = 'sparky'; // TypeError 발생
  delete obj.foo;     // TypeError 발생
  delete obj.quaxxor; // 'quaxxor' 속성은 존재한 적이 없으므로 true 반환
  obj.sparky = 'arf'; // TypeError 발생
}

fail();

// Object.defineProperty를 사용해 시도하는 변경
// 아래 두 구문 모두에서 TypeError 발생
Object.defineProperty(obj, 'ohai', { value: 17 });
Object.defineProperty(obj, 'foo', { value: 'eit' });

// 프로토타입 변경도 불가능
// 아래 두 구문 모두에서 TypeError 발생
Object.setPrototype(obj, { x: 20 });
obj.__proto__ = { x: 20 };

배열 동결

let a = [0];
Object.freeze(a); // 이제 배열 변경 불가

a[0]=1; // 조용히 실패
a.push(2); // 조용히 실패

// 엄격 모드에서는 TypeError 발생
function fail() {
  "use strict"
  a[0] = 1;
  a.push(2);
}

fail();

동결한 객체는 불변하지만, 꼭 상수인건 아닙니다. 다음 예제는 동결 객체가 상수가 아님(즉, 얕은 동결임)을 보입니다.

obj = {
  internal: {}
};

Object.freeze(obj);
obj.internal.a = 'aValue';

obj.internal.a // 'aValue'

객체가 상수려면 모든 참조 그래프(다른 객체로의 직간접적 참조)가 오로지 동결 객체만 가리켜야 합니다. 동결한 객체는 객체 내의 모든 상태(값과 참조)가 고정되기 때문에 불변하다고 합니다. 문자열, 숫자, 불리언 값은 언제나 불변하고, 함수와 배열은 객체임을 주의하세요.

"얕은 동결"

Object.freeze(object)의 결과는 object 스스로의 속성에만 적용되며, object에 대한 속성 추가, 제거, 재할당 연산만 방지합니다. 만약 object의 속성이 다른 객체라면 그 객체는 동결되지 않으며 속성 추가, 제거, 재할당의 대상이 될 수 있습니다.

 

var employee = {
  name: "Mayank",
  designation: "Developer",
  address: {
    street: "Rohini",
    city: "Delhi"
  }
};

Object.freeze(employee);

employee.name = "Dummy"; // 비엄격 모드에서 조용히 실패
employee.address.city = "Noida"; // 자식 객체의 속성은 수정 가능

console.log(employee.address.city) // "Noida"

 

사용 참고

ES5에서는 Object.freeze() 메서드의 인자가 객체가 아닐 때(즉, 원시형일 때)는 TypeError가 발생합니다. ES6에서는 원시형 인자도 얼려진 객체라고 취급해서 TypeError를 발생시키지 않고 원시형 인자를 그대로 반환합니다.

> Object.freeze(1)
TypeError: 1 is not an object // ES5 code

> Object.freeze(1)
1                             // ES6 code

명세

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.freeze' in that specification.
Standard Initial definition. Implemented in JavaScript 1.8.5.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.freeze' in that specification.
Standard  
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.freeze' in that specification.
Draft  

브라우저 호환성

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
Basic supportChrome Full support 6Edge Full support YesFirefox Full support 4IE Full support 9Opera Full support 12Safari Full support 5.1WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

같이 보기

문서 태그 및 공헌자

이 페이지의 공헌자: alattalatta, roupkk, hanmomhanda
최종 변경자: alattalatta,