TypeError: Iterator/AsyncIterator constructor can't be used directly

當你嘗試直接使用 Iterator()AsyncIterator() 建構函式來建立例項時,會發生 JavaScript 異常 "Iterator 建構函式不能直接使用" 或 "AsyncIterator 建構函式不能直接使用"。這些建構函式是抽象類,只能被繼承。

訊息

TypeError: Abstract class Iterator not directly constructable (V8-based)
TypeError: Iterator constructor can't be used directly (Firefox)
TypeError: Iterator cannot be constructed directly (Safari)

TypeError: Abstract class AsyncIterator not directly constructable (V8-based)
TypeError: AsyncIterator constructor can't be used directly (Firefox)
TypeError: AsyncIterator cannot be constructed directly (Safari)

錯誤型別

TypeError

哪裡出錯了?

IteratorAsyncIterator 建構函式是抽象類,不應直接使用。它們會檢查 new.target 的值,如果它與建構函式本身相同,則會丟擲錯誤。使用這些建構函式的唯一方法是在子類中繼承它們,並在子類建構函式中呼叫 super()。子類還必須定義一個 next() 方法才能有用。

示例

無效案例

js
new Iterator();

有效情況

js
class MyIterator extends Iterator {
  #step;
  #end;
  constructor(start, end) {
    // Implicitly calls new Iterator(), but with a different `new.target`
    super();
    this.#step = start;
    this.#end = end;
  }
  next() {
    if (this.#step >= this.#end) {
      return { done: true };
    }
    return { value: this.#step++, done: false };
  }
}

new MyIterator();

另見