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