可能性のある複製:
読み取り専用プロパティを純粋なJavaScriptに実装できますか?
構築時にのみ定義したいオブジェクトがあります。オブジェクト参照が変更されないようにするにはどうすればよいですか?
現実的に...それを上書きしないことによって。 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への参照は、オブジェクト作成後に変更できません。
これの実用的な使い方を考えています。
現在広く利用されている実装 ECMAScript は、実際の不変性をサポートしていません。
ECMAScript 5 標準では、Object.seal
およびObject.freeze
メソッドが追加されています。
Object.seal
メソッドは、プロパティの追加を防ぎ、ユーザーがプロパティに書き込みまたは編集できるようにします。
Object.freeze
メソッドはオブジェクトを完全にロックします。オブジェクトは、freezeしたときとまったく同じ状態を保ち、オブジェクトが凍結されるとunfrozen。
結論として、実際のオブジェクトの不変性については、ECMAScript 5まで待つ必要があります。
より詳しい情報: