2016-11-26 6 views
1

クラスのインスタンスに格納されているプロパティを保護する必要がある場合があります。私のクラスだけがインスタンスの特定のプロパティを取得/設定するためのアクセス権を持っていればよいので、私のソリューションはこのクラスのファクトリ関数を持つことです。このファクトリ内では、各インスタンスのデータを格納する配列を格納します。プライベートデータのクラス(JavaScript)

だから私は、例えば、これを持っていると思います:

​​

instanceDataは、すべてのプロパティのキーは文字列にキャストしているため、配列があるので、私はのオブジェクトを含む、そこに内部の配列を置く理由そのインスタンスを第1の要素として含み、そのインスタンスのデータを第2の要素として含む。

インスタンスのデータにアクセスするには、array[0] === instanceの中にあるinstanceDataの配列を検索するだけです。

私の例は正常に動作しますが、ガベージコレクタはどうですか? instanceDataがインスタンスを保持する場合、インスタンスはどのようにガベージコレクトされますか?

答えて

2

instanceDataでインスタンスをガベージコレクトするにはどうすればできますか?

これはできません。そのため、このアプローチを使用すべきではありません。代わりにWeakMapを使用してください。

また、WeakMapの検索では、平均でサブラインになるように強制しています。配列では線形です。

let instanceData = new WeakMap(); 
 
class AClass { 
 
    constructor() { 
 
    // Write 
 
    instanceData.set(this, { 
 
     'privateProperty': true 
 
    }); 
 
    // Read 
 
    console.log(instanceData.get(this)); 
 
    } 
 
} 
 
new AClass();

2

プライベートプロパティを使用したい場合は、記号はあなたを助けるかもしれません。

const SOME_PROPERTY = Symbol('someProperty'); 
 
class AClass { 
 
    constructor(){ 
 
     this[SOME_PROPERTY] = true; 
 
    } 
 
    get someProperty(){ 
 
     return this[SOME_PROPERTY]; 
 
    } 
 
} 
 
var aObj = new AClass(); 
 
console.log(aObj.someProperty);

関連する問題