.freeze()

オブジェクトを凍結(freeze)し、新しいプロパティの追加、既存のプロパティの削除、また既存のプロパティとそれらの列挙可、設定可、書き込み可の変更を防ぎます。 本質的にはオブジェクトを、実質的に不変なものにします。 このメソッドの戻り値は、凍結されたオブジェクトになります。

文法

Object.freeze(obj)
引数 説明
obj 凍結するオブジェクトを指定します。

凍結されたオブジェクトに設定されているプロパティに対しては、 何者も追加または削除することは出来ません。 そういった事を試みようとするとそれは失敗し、何も起こらないか、またはTypeErrorがスローされます。 (一般的には、strictモードの場合にのみ)

データ記述子(descriptor)のプロパティは、値を変更することは出来ません。 アクセサ記述子(descriptor)のプロパティ(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内の各オブジェクトを凍結します。
// それをするために、下記の関数を使用します。
function deepFreeze (o) {
  var prop, propKey;
  Object.freeze(o); // まず、このオブジェクトを凍結
  for (propKey in o) {
    prop = o[propKey];
    if (o.hasOwnProperty(propKey) && prop instanceof Object && !Object.isFrozen(prop)) {
      // prototype上のオブジェクト、オブジェクトでは無いものは、
      // ここでは既に凍結されているのでスキップします。
      // 既に凍結されたオブジェクトが未凍結のオブジェクトを含む場合、
      // どこかに未凍結の参照が残される可能性があることに注意して下さい。

      deepFreeze(prop); // deepFreezeを再帰的に呼び出し
    }
  }
}

obj2 = {
  internal : {}
};

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

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本 6 4.0 (2) 9 12 5.1
モバイル
機能 Android Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本 ? ? ? ? ?

Based on Kangax's compat table.

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。