使用私有数据(JavaScript)初始化
我有一个案例,需要保护存储在类实例中的属性。我希望只有我的类有权获取/设置实例的某些属性,因此我的解决方案是为这个类提供一个工厂函数,并在这个工厂中存储一个数组,该数组存储每个实例的数据 例如,我有这样一个例子:使用私有数据(JavaScript)初始化,javascript,Javascript,我有一个案例,需要保护存储在类实例中的属性。我希望只有我的类有权获取/设置实例的某些属性,因此我的解决方案是为这个类提供一个工厂函数,并在这个工厂中存储一个数组,该数组存储每个实例的数据 例如,我有这样一个例子: let instanceData = []; class AClass { constructor () { instanceData.push([this, { 'privateProperty': true }]);
let instanceData = [];
class AClass {
constructor () {
instanceData.push([this, {
'privateProperty': true
}]);
}
}
instanceData
之所以是数组,是因为每个属性的键都转换为字符串,所以我将数组放在其中,将该实例的对象作为第一个元素,将该实例的数据作为第二个元素
当我想访问一个实例的数据时,我只需要搜索一个数组,该数组在instanceData
中包含array[0]==instance
我的示例可以很好地工作,但是垃圾收集器呢?如果instanceData
将保存实例,那么如何对实例进行垃圾收集
如果instanceData
将保存实例,那么如何对实例进行垃圾收集
他们不能。这就是为什么你不应该使用这种方法。取而代之的是,使用一个
此外,该规范强制弱映射中的搜索平均为次线性。如果使用阵列,它将是线性的
let instanceData=new WeakMap();
类AClass{
构造函数(){
//写
instanceData.set(此{
“privateProperty”:true
});
//阅读
log(instanceData.get(this));
}
}
新AClass()代码>
如果instanceData
将保存实例,那么如何对实例进行垃圾收集
他们不能。这就是为什么你不应该使用这种方法。取而代之的是,使用一个
此外,该规范强制弱映射中的搜索平均为次线性。如果使用阵列,它将是线性的
let instanceData=new WeakMap();
类AClass{
构造函数(){
//写
instanceData.set(此{
“privateProperty”:true
});
//阅读
log(instanceData.get(this));
}
}
新AClass()代码>若要使用私有属性,Symbol可能会帮助您
const SOME_PROPERTY=Symbol('someProperty');
类AClass{
构造函数(){
这[某些属性]=真;
}
获取某些属性(){
返回此[某些属性];
}
}
var aObj=new AClass();
console.log(aObj.someProperty)代码>若要使用私有属性,Symbol可能会帮助您
const SOME_PROPERTY=Symbol('someProperty');
类AClass{
构造函数(){
这[某些属性]=真;
}
获取某些属性(){
返回此[某些属性];
}
}
var aObj=new AClass();
console.log(aObj.someProperty)代码>