33. WeakSets(WeakSet)
优质
小牛编辑
125浏览
2023-12-01
WeakSets 与 Sets 类似,但有以下区别:
它们可以保存对象,而不会阻止这些对象被垃圾收集。
它们是黑盒子:如果你同时拥有 WeakSet 和一个值,你只能从 WeakSet 中获取任何数据。支持的唯一方法是
.add()
,.delete()
,.has()
。有关为什么 WeakSets 不允许迭代,循环和清除的原因,请参考 WeakMaps 部分作为黑盒。
鉴于您无法迭代其元素,WeakSets 的用例并不多。它们可以让您标记对象。
33.1。示例:将对象标记为可以安全使用方法
Domenic Denicola 显示类Foo
如何确保其方法仅应用于由它创建的实例:
const foos = new WeakSet();
class Foo {
constructor() {
foos.add(this);
}
method() {
if (!foos.has(this)) {
throw new TypeError('Incompatible object!');
}
}
}
const foo = new Foo();
foo.method(); // works
assert.throws(
() => {
const obj = {};
Foo.prototype.method.call(obj); // throws an exception
},
TypeError
);
33.2。 WeakSet API
WeakSet
的构造函数和三种方法与的Set
等价物的作用相同:
new WeakSet<T>(values?: Iterable<T>)
[ES6].add(value: T): this
[ES6].delete(value: T): boolean
[ES6].has(value: T): boolean
[ES6]