給急躁的程式設計師的 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 相同