gpt4 book ai didi

javascript - 带有 WeakMap 的 JavaScript 中的多个私有(private)属性

转载 作者:行者123 更新时间:2023-12-04 10:28:47 25 4
gpt4 key购买 nike

我想将我的类属性设置为私有(private),所以我使用了 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;
}
}
}

最佳答案

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

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 - 带有 WeakMap 的 JavaScript 中的多个私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60508396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com