Set/WeakSet/Map/WeakMap的简介与不同
Set是类数组,成员唯一,可遍历
WeakSet成员唯一且只能是对象,弱引用,不占引用数, 不能遍历(例子:保证Foo的实例方法只在Foo的实例上调用,把this add到WeakSet实例中,调用方法时判断this 是否在WeakSet实例中)
Map是类对象,key可以是非字符串,设置时不会转类型,1 与 ‘1’ 是两个key,key为对象时,以内存地址为准,可遍历
WeakMap是类对象,key只能是对象,弱引用,不占用引用数(防止内存泄漏,例子:把可能会消失的dom写道WeakMap实例中,防止内存泄漏)
WeakSet应用1-保证Foo的实例方法,只能在Foo的实例上调用
新建了一个foo:WeakSet,在Foo这个类实例化时把this加入到foo中,调用method时判断this是否在foo中
这样就保证了method在Foo实例中调用
const foos = new WeakSet()
class Foo {
constructor() {
foos.add(this)
}
method () {
if (!foos.has(this)) {
throw new TypeError('Foo.prototype.method 只能在Foo的实例上调用!');
}
}
}
部署私有属性,而不担心内存泄漏(WeakMap应用1)
Countdown
类的两个内部属性_counter
和_action
,是实例的弱引用,所以如果删除实例,它们也就随之消失,不会造成内存泄漏。
const _counter = new WeakMap();
const _action = new WeakMap();
class Countdown {
constructor(counter, action) {
_counter.set(this, counter);
_action.set(this, action);
}
dec() {
let counter = _counter.get(this);
if (counter < 1) return;
counter--;
_counter.set(this, counter);
if (counter === 0) {
_action.get(this)();
}
}
}
const c = new Countdown(2, () => console.log('DONE'));
c.dec()
c.dec()
// DONE