在JavaScript中使用WeakMap对象时,get和set方法需要一个键作为参数传入。
仅供参考,我使用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的性能?
我知道基本类型不能用作key,但也许使用一个只有一个属性的对象作为key可能比使用一个有一千个属性的对象更快。
我尝试查看ECMA规范,但没有指定,我猜是因为它取决于浏览器的实现。
编辑:有两种使用WeakMaps的方法,一种是声明一个_privateProperties WeakMap,我将在其中添加我的私有属性,另一种方法是为每个私有属性声明一个WeakMap。我目前正在使用第二种方法,这样每个WeakMap都可以被单独垃圾回收,但使用第一种方法可能会让我进行更少的.get调用。但我想这超出了问题的范围:)
发布于 2018-08-20 04:29:56
我不确定这是不是一个好主意,但是你可以通过使用符号来创建一些私有的实例属性。
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](){
/* ... */
}
}如果不访问这些符号值,就很难访问这些特定的实例属性(另外,使用Symbol定义的实例属性在类和对象中是不可枚举的)。
顺便说一句,“私有实例方法和访问器”处于第3阶段,因此这样的解决方案可能很快就不会出现了,https://github.com/tc39/proposals
https://stackoverflow.com/questions/46325968
复制相似问题