面向急性子的程序员的 JavaScript(ES2022 版)
请支持本书:购买捐赠
(广告,请勿屏蔽。)

36 WeakSets (WeakSet)(高级)



WeakSets 与 Sets 类似,但有以下区别

鉴于我们无法迭代它们的元素,因此 WeakSets 的用例并不多。它们确实使我们能够标记对象。

36.1 示例:将对象标记为可安全地与方法一起使用

以下代码演示了一个类如何确保其方法仅应用于由其创建的实例(基于 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
);

36.2 WeakSet API

WeakSet 的构造函数和三种方法的工作方式与其Set 等效项相同