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();

另见