33. WeakSets(WeakSet

原文: http://exploringjs.com/impatient-js/ch_weaksets.html

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]

书籍推荐