【问题标题】:Multiple private properties in JavaScript with WeakMap带有 WeakMap 的 JavaScript 中的多个私有属性
【发布时间】:2020-06-15 21:40:27
【问题描述】:

我想将我的类属性设置为私有,所以我使用了 WeakMap,但只使用了一个 WeakMap。创建项目后,我只获得最后一个对象数据,之前的数据被删除...

这是我的代码定义:

const Item = (() => {
  const weakMap = new WeakMap();
  const _id = {};
  const _text = {};

  class Item {
    constructor({id, text}) {
      weakMap.set(_id, {id});
      weakMap.set(_text, {text});
    }

    getId() {
      return weakMap.get(_id).id;
    }

    getText() {
      return weakMap.get(_text).text;
    }
  }

  return Item;
})();

在这里我创建了一个包含所有项目的数组:

const items = myItems.map(item => {
  const newItem = new Item(item);
  console.log('new item created, id: ' + newItem.getId());
  return newItem;
});

项目制作精良,我明白了:

new item created, id: 1
new item created, id: 2
new item created, id: 3
new item created, id: 4

但是当我迭代我的项目时,我得到:

items.forEach(element => console.log(element.getId() + ' ' + element.getText()));

4 Fourth description
4 Fourth description
4 Fourth description
4 Fourth description

这是一个活生生的例子:https://plnkr.co/edit/pFCOcCVl1AQEJqSKvfVX

关闭也不起作用:

const Answer = (() => {
  const weakMap = new WeakMap();
  const _id = {};
  const _text = {};

  class Answer {
    getId;
    getText;

    constructor({id, text}) {
      weakMap.set(_id, {id});
      weakMap.set(_text, {text});

      this.getId = () => weakMap.get(_id).id;
      this.getText = () => weakMap.get(_text).text;
    }
  }
}

【问题讨论】:

    标签: javascript arrays ecmascript-6 javascript-objects weakmap


    【解决方案1】:

    如果您使用WeakMap 来实现私有属性,则映射中的键通常是对象/实例本身。该值是一个包含所有私有属性的对象。

    const Item = (() => {
      const weakMap = new WeakMap();
    
      class Item {
        constructor({id, text}) {
          const privateData = {id, text};
          weakMap.set(this, privateData);
        }
    
        getId() {
          return weakMap.get(this).id;
        }
    
        getText() {
          return weakMap.get(this).text;
        }
      }
    
      return Item;
    })();
    

    【讨论】:

    • 在现实生活中在 JavaScript 中使用如此复杂的结构有什么意义?
    • @Felix 谢谢,所以我可以为每个 WeakMap 设置一个对象。
    • @EugenSunic:TBH 我不知道。但我假设如果没有私有财产的用例,就不会有添加它们的建议。 github.com/tc39/proposal-class-fields#private-fields
    猜你喜欢
    • 2013-09-04
    • 2014-04-05
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    相关资源
    最近更新 更多