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
哪裡出錯了?
Iterator 和 AsyncIterator 建構函式是抽象類,不應直接使用。它們會檢查 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();