mozilla
Your Search Results

    Object.freeze()

    概要

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

    構文

    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 に基づきます。

    関連情報

    ドキュメントのタグと貢献者

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