WeakSet
)(高级)WeakSets 与 Sets 类似,但有以下区别
它们可以保存对象,而不会阻止这些对象被垃圾回收。
它们是黑盒子:只有在我们同时拥有 WeakSet 和值时,才能从 WeakSet 中获取任何数据。唯一支持的方法是 .add()
、.delete()
、.has()
。有关 WeakSets 不允许迭代、循环和清除的原因的解释,请参阅WeakMaps 作为黑盒子一节。
鉴于我们无法迭代它们的元素,因此 WeakSets 的用例并不多。它们确实使我们能够标记对象。
以下代码演示了一个类如何确保其方法仅应用于由其创建的实例(基于 Domenic Denicola 的代码)
const instancesOfSafeClass = new WeakSet();
class SafeClass {
constructor() {
.add(this);
instancesOfSafeClass
}
method() {
if (!instancesOfSafeClass.has(this)) {
throw new TypeError('Incompatible object!');
}
}
}
const safeInstance = new SafeClass();
.method(); // works
safeInstance
.throws(
assert=> {
() const obj = {};
.prototype.method.call(obj); // throws an exception
SafeClass,
}TypeError
; )
WeakSet
的构造函数和三种方法的工作方式与其Set
等效项相同
new WeakSet<T>(values?: Iterable<T>)
[ES6].add(value: T): this
[ES6].delete(value: T): boolean
[ES6].has(value: T): boolean
[ES6]