Generator
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2016年9月.
Generator オブジェクトはジェネレーター関数によって返され、反復可能プロトコルとイテレータープロトコルの両方に準拠しています。
Generator は Iterator クラスのサブクラスです。
コンストラクター
Generator コンストラクターに関する JavaScript の実体はありません。Generator のインスタンスはジェネレーター関数から返す必要があります。
function* generator() {
yield 1;
yield 2;
yield 3;
}
const gen = generator(); // "Generator { }"
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
ジェネレーター関数によって生成されるすべてのオブジェクトが共有する隠されたプロトタイプオブジェクトだけがあります。このオブジェクトはクラスに見せかけるため Generator.prototype と表記されることが多いですが、GeneratorFunction が実際の JavaScript エンティティであるため、より適切には GeneratorFunction.prototype.prototype と呼ぶべきです。Generatorインスタンスのプロトタイプチェーンを理解するには、GeneratorFunction.prototype.prototype を参照してください。
インスタンスプロパティ
これらのプロパティは Generator.prototype に定義され、すべての Generator インスタンスで共有されます。
Generator.prototype.constructor-
作成されたインスタンスオブジェクトのコンストラクター関数です。
Generatorインスタンスでは、初期値はGeneratorFunction.prototypeです。メモ:
Generatorオブジェクトは、それ自体を作成したジェネレーター関数への参照を格納しません。 Generator.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]プロパティの初期値であり、文字列"Generator"です。このプロパティはObject.prototype.toString()で使用されます。
インスタンスメソッド
親である Iterator から継承したインスタンスメソッドもあります。
Generator.prototype.next()-
yield式で得られた値を返します。 Generator.prototype.return()-
ジェネレーターの本体内で、現在の停止位置に
return文が挿入されたかのように振る舞い、これによりジェネレーターが完了します。また、try...finallyブロックと組み合わせることで、ジェネレーターがクリーンアップ処理を実行することができるようにします。 Generator.prototype.throw()-
ジェネレーターの本体において、現在の停止位置に
throw文が挿入されたかのように振る舞います。これによりジェネレーターはエラー状態を認識し、エラーを処理したり、クリーンアップを実行して自身を終了させたりすることができます。
例
>無限イテレーター
ジェネレーター関数では、値は必要になるまで評価されません。したがってジェネレーターは、潜在的に無限のデータ構造を定義することができます。
function* infinite() {
let index = 0;
while (true) {
yield index++;
}
}
const generator = infinite(); // "Generator { }"
console.log(generator.next().value); // 0
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
// …
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-generator-objects> |