2016-11-26 41 views
1

我遇到了需要保護存儲在類的實例中的屬性的情況。我希望只有我的類可以獲取/設置某個實例的某些屬性 - 所以我的解決方案是爲這個類創建一個工廠函數,並且在這個工廠內部存儲一個存儲每個實例的數據的數組。使用私有數據的類(JavaScript)

所以我有這樣的,例如:

​​

之所以instanceData是一個數組是因爲每個屬性的關鍵投射到字符串,所以我把數組裏面就有,包含的對象該實例作爲第一個元素幷包含該實例的數據作爲第二個元素。

當我想要訪問實例的數據時,我只需要搜索instanceData內部有array[0] === instance的數組。

我的例子可以正常工作,但垃圾收集器呢?如果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);