首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WeakMap性能是否受关键对象的影响?

WeakMap性能是否受关键对象的影响?
EN

Stack Overflow用户
提问于 2017-09-20 23:20:37
回答 1查看 952关注 0票数 3

在JavaScript中使用WeakMap对象时,getset方法需要一个键作为参数传入。

仅供参考,我使用WeakMap来模拟一个类的私有属性,如下所示:

代码语言:javascript
复制
window.MyObject = (function(){
  let _privateProperty = new WeakMap();
  class MyObject {
    constructor(value) {
      _privateVariable.set(this, value);
    }
    SamplePrivateGet() {
      return _privateVariable.get(this);
    }
  }
  return MyObject;
})();

我的问题是:作为键的对象是否会影响getset的性能?

我知道基本类型不能用作key,但也许使用一个只有一个属性的对象作为key可能比使用一个有一千个属性的对象更快。

我尝试查看ECMA规范,但没有指定,我猜是因为它取决于浏览器的实现。

编辑:有两种使用WeakMaps的方法,一种是声明一个_privateProperties WeakMap,我将在其中添加我的私有属性,另一种方法是为每个私有属性声明一个WeakMap。我目前正在使用第二种方法,这样每个WeakMap都可以被单独垃圾回收,但使用第一种方法可能会让我进行更少的.get调用。但我想这超出了问题的范围:)

EN

回答 1

Stack Overflow用户

发布于 2018-08-20 04:29:56

我不确定这是不是一个好主意,但是你可以通过使用符号来创建一些私有的实例属性。

代码语言:javascript
复制
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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46325968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档