首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WeakMap的JavaScript中的多个私有属性

使用WeakMap的JavaScript中的多个私有属性
EN

Stack Overflow用户
提问于 2020-03-03 21:30:47
回答 1查看 190关注 0票数 2

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

这是我的代码定义:

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

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

代码语言:javascript
复制
const items = myItems.map(item => {
  const newItem = new Item(item);
  console.log('new item created, id: ' + newItem.getId());
  return newItem;
});

这些项目都创建得很好,我得到了:

代码语言:javascript
复制
new item created, id: 1
new item created, id: 2
new item created, id: 3
new item created, id: 4

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

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

同样在闭包的情况下,它也不起作用:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-03 22:01:26

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

代码语言:javascript
复制
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;
})();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60508396

复制
相关文章

相似问题

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