2011-07-14 13 views
0

問題は、オブジェクトの外側からのオーバーライドを防ぐことです。セッターによるアクセスを防止する

私の考えではセッターを使用することです:

var spot = function(val){ 
    this.id = val; 
    this.__defineSetter__("id", function(val){alert("bang");}); 
} 

idがconstuctorに一度設定する必要があり、変更されることはありません。 私は10.000のスポットがあるので、プロトタイプにセッターを定義したいと思います。しかし、この場合、セッターはコンストラクターにもアクセスします。

コンストラクタでvar idを使用してゲッターを定義するつもりはありません。この場合、(10.000)オブジェクトのすべて1つに独自のクロージャがあります。

2番目の質問は、varがコンストラクタから変更されたか、後で(スポット)内部関数から変更されたかを設定者が何とか知っていますか?だから私はオブジェクトの外からのアクセスを防ぐことができます。

答えて

1

まず、このコードは標準ではなく、推奨されていません。開発しているプラ​​ットフォームによっては、preventExtensionsまたはfreezeを使用することをお勧めします。または、idプロパティを読み取り専用として定義する場合は、definePropertyを使用します。

第2に、既に行ったように、spotの各インスタンスには既に独自のクロージャがあります。あなたが定義したそのセッターは、すべてのスポット、別名クロージャーに存在するユニークな関数+レキシカルスコープです。だからゲッターを作ることで何が大事なのか分かりません。ここでは最初の点が優先されますが、その機能を実現するには新しい方法を使用する必要があります。

最後に、どの方向をとっても、設定者は何も知ることができません。したがって、isInitialisedの曲に別の変数を持たせるか、最初に値がundefinedになるようにコード不変式を作成し、変数が定義済みの値を持っているかどうかを簡単にチェックできるようにしますそれは設定されており、再度設定しないでください。

+0

あなたの迅速な対応のために。 – kainar

関連する問題