JavaScript 中的多个私有属性与 WeakMap
Multiple private properties in JavaScript with WeakMap
我想将我的 class 属性设置为私有,所以我使用了 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
实现私有属性,map中的key通常是object/instance本身。该值是一个包含所有私有属性的对象。
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;
})();
我想将我的 class 属性设置为私有,所以我使用了 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
实现私有属性,map中的key通常是object/instance本身。该值是一个包含所有私有属性的对象。
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;
})();