web-dev-qa-db-ja.com

Javascriptで変数/オブジェクトを読み取り専用にするにはどうすればよいですか?

可能性のある複製:
読み取り専用プロパティを純粋なJavaScriptに実装できますか?

構築時にのみ定義したいオブジェクトがあります。オブジェクト参照が変更されないようにするにはどうすればよいですか?

29
qodeninja

現実的に...それを上書きしないことによって。 SetObjなしでGetObjのみを提供するオブジェクトでラップすることにより、いつでもアクセスを制御できますが、もちろん、ラッパーは、GetObjメソッドによって「非表示」になる「プライベート」メンバープロパティと同様に、上書きされる可能性があります。

実際、質問はだまされています:

読み取り専用プロパティを純粋なJavaScriptに実装できますか?

編集:

http://javascript.crockford.com/private.html を読んだ後、クロージャーを使用して、外部から真にアクセスできない変数参照を作成することができます。例えば:

function objectHider(obj)
{
    this.getObject=function(){return obj;}
}

var someData={apples:5,oranges:4}

var hider=new objectHider(someData);

//... hider.getObject()

ここで、objectHider内のobjへの参照は、オブジェクト作成後に変更できません

これの実用的な使い方を考えています。

14
spender

現在広く利用されている実装 ECMAScript は、実際の不変性をサポートしていません。

ECMAScript 5 標準では、Object.sealおよびObject.freezeメソッドが追加されています。

Object.sealメソッドは、プロパティの追加を防ぎ、ユーザーがプロパティに書き込みまたは編集できるようにします。

Object.freezeメソッドはオブジェクトを完全にロックします。オブジェクトは、freezeしたときとまったく同じ状態を保ち、オブジェクトが凍結されるとunfrozen

結論として、実際のオブジェクトの不変性については、ECMAScript 5まで待つ必要があります。

より詳しい情報:

51
CMS