Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用私有数据(JavaScript)初始化_Javascript - Fatal编程技术网

使用私有数据(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)