TypeError: 迭代器/异步迭代器构造函数不能直接使用

当您尝试直接使用 Iterator()AsyncIterator() 构造函数来创建实例时,会发生 JavaScript 异常“迭代器构造函数不能直接使用”或“异步迭代器构造函数不能直接使用”。这些构造函数是抽象类,应仅从其继承。

消息

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)

错误类型

出了什么问题?

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 { value: this.#step++, done: false };
    } else {
      return { done: true };
    }
  }
}

new MyIterator();

另请参见