WeakSet
)(高级)非参照集合与集合类似,但具有以下不同点
它们可以保留对象,而不会阻止对这些对象进行垃圾回收。
它们是黑匣子:仅当我们同时拥有非参照集合和一个值时,才会从非参照集合中获取任何数据。支持的唯一方法是 .add()
、.delete()
、.has()
。请参阅非参照映射作为黑匣子部分,了解为什么非参照集合不允许迭代、循环和清除的解释。
鉴于我们无法迭代其元素,因此非参照集合的用例不多。它们确实使我们能够标记对象。
以下代码演示了如何通过一个类确保只有它创建的实例才能应用自己的方法(基于 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]