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