包含私有数据的类(JavaScript)

时间:2016-11-26 20:24:01

标签: javascript

我需要保护存储在类实例中的属性。我希望只有我的类可以访问获取/设置实例的某些属性 - 所以我的解决方案是为这个类提供一个工厂函数,在这个工厂里面我存储一个存储每个实例数据的数组。

所以我有这个,例如:

filter fil;
fil.add(new foo());
fill.add(new bar1());
fill.add(new bar2());

foo f = fill.get();
while(f != nullptr)
{
    f->process();
    delete f;
    f = fil.get();
}

let instanceData = []; class AClass { constructor () { instanceData.push([this, { 'privateProperty': true }]); } } 是一个数组的原因是因为每个属性的键都转换为字符串,所以我把数组放在那里,包含该实例的对象作为第一个元素,并包含该实例的数据为第二个元件。

当我想访问实例的数据时,我只需要在instanceData内搜索array[0] === instance的数组。

我的例子可以正常工作,但垃圾收集器呢?如果instanceData能够保存实例,那么如何对实例进行垃圾回收?

2 个答案:

答案 0 :(得分:2)

  

如果free拥有实例,那么如何对实例进行垃圾回收?

他们不能。这就是你不应该使用这种方法的原因。相反,请使用WeakMap

此外,规范强制WeakMap中的搜索平均为次线性。使用数组它将是线性的。

instanceData

答案 1 :(得分:2)

如果您想使用私有属性,Symbol可能会帮助您。

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);