在JavaScript中使用WeakMap
对象时,get
和set
方法需要将Key作为参数传入。
仅供参考,我使用WeakMap
来模拟某个类的私有属性,如下所示:
window.MyObject = (function(){
let _privateProperty = new WeakMap();
class MyObject {
constructor(value) {
_privateVariable.set(this, value);
}
SamplePrivateGet() {
return _privateVariable.get(this);
}
}
return MyObject;
})();
我的问题是:get
和set
的效果是否受到用作关键字的对象的影响?
我知道原始类型不能用作键,但是使用只有一个属性作为键的对象可能比使用具有一千个属性的对象更快。
我尝试查看ECMA规范,但未指定,我的猜测是因为它取决于浏览器的实现。
编辑:有两种方法可以使用WeakMaps来处理这个问题,一种方法是声明一个_privateProperties
WeakMap,我将添加我的私有属性,另一种方法为每个私有属性声明一个WeakMap。我目前正在使用第二种方法,以便每个WeakMap可以单独收集垃圾,但是可能与第一种方法一起使用可以让我减少.get
次呼叫。但我认为这超出了问题的范围:)
答案 0 :(得分:-1)
不确定这是否是个好主意,但是您可以通过使用Symbols来创建某种私有实例属性。
const PRIVATE_VAR = Symbol('MY_CLASS::PRIVATE_VAR');
const PRIVATE_FUNC = Symbol('MY_CLASS::PRIVATE_FUNC');
export default class MyClass{
constructor(value){
this[PRIVATE_VAR] = value;
}
[PRIVATE_FUNC](){
/* ... */
}
}
如果无法访问这些Symbols值,则很难访问那些特定的实例属性(加上使用Symbols定义的实例属性在类和对象中是不可枚举的)。
btw'私有实例方法和访问器'处于第3阶段,因此此类解决方案可能很快就不适用 https://github.com/tc39/proposals