Object.freeze

JavaScript 1.8.5 で導入

概要

オブジェクトを凍結します: これは、新しいプロパティの追加、既存のプロパティの削除、既存のプロパティやプロパティの列挙可否、設定変更可否、書き込み可否の変更を抑制します。本質的には、オブジェクトを実質的に不変にします。このメソッドは凍結されたオブジェクトを返します。

Object のメソッド
実装されたバージョン JavaScript 1.8.5
ECMAScript エディション ECMAScript 5th Edition

構文

Object.freeze(obj)

引数

obj
凍結するオブジェクトです。

説明

凍結されたオブジェクトにプロパティのセットを追加あるいは削除することはできません。そのような試みは、暗黙的あるいは TypeError エラーを発生させて (もっとも一般的には strict mode において、ただしこれに限定はされません) 失敗します。

データプロパティの値を変更することはできません。アクセサプロパティ (getter および setter) は同様に動作します (そして、値を変更しているかのようにみえます)。オブジェクトとしての値は、それもまた凍結されない限り依然として変更可能であることに注意してください。

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

// 新しいプロパティは追加でき、既存のプロパティは変更や削除ができます
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;

var o = Object.freeze(obj);

assert(Object.isFrozen(obj) === true);

// ここではすべての変更が失敗します
obj.foo = "quux"; // 暗黙的に何も行われません
obj.quaxxor = "the friendly duck"; // 暗黙的にプロパティは追加されません

// また、strict モードではこれらの試みに対して TypeErrors が発生します
function fail(){
  "use strict";
  obj.foo = "sparky"; // TypeError が発生
  delete obj.quaxxor; // TypeError が発生
  obj.sparky = "arf"; // TypeError が発生
}

fail();

// Object.defineProperty を用いる変更も失敗します
Object.defineProperty(obj, "ohai", { value: 17 }); // TypeError が発生
Object.defineProperty(obj, "foo", { value: "eit" }); // TypeError が発生

以下の例は、凍結されたオブジェクトのオブジェクト値が変更可能であること(凍結が浅いこと)を示します。

obj = {
  internal : {}
};

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

obj.internal.a // "aValue"

// obj を完全な不変状態にするには、obj 内の各オブジェクトを凍結します
// これを行うには、以下の関数を用います

function deepFreeze (o) {
  var prop, propKey;
  Object.freeze(o); // はじめにオブジェクトを凍結します
  for (propKey in o) {
    prop = o[propKey];
    if (!o.hasOwnProperty(propKey) || !(typeof prop === "object") || Object.isFrozen(prop)) {
      // オブジェクトがプロトタイプ上にある、オブジェクトではない、すでに凍結されているのいずれかに当てはまる場合は 
      // スキップします。凍結されていないオブジェクトを含む凍結されたオブジェクトがすでにある場合には、
      // どこかに凍結されていない参照を残す可能性があることに注意してください。
      continue;
    }

    deepFreeze(prop); // deepFreeze を再帰呼び出しします
  }
}

obj2 = {
  internal : {}
};

deepFreeze(obj2);
obj2.internal.a = "anotherValue";
obj2.internal.a; // undefined

ブラウザの互換性

機能 Firefox (Gecko) Chrome Internet Explorer Opera Safari
基本サポート 4 (2.0) 6 9 12 5.1
機能 Firefox Mobile (Gecko) Android IE Mobile Opera Mobile Safari Mobile
基本サポート ? ? ? ? ?

Kangax's compat table に基づきます。

関連情報

Document Tags and Contributors

Contributors to this page: coeurl, ethertank, yyss
最終更新者: ethertank,