GeneratorFunction.prototype.prototype
prototype は GeneratorFunction.prototype のプロパティで、すべてのジェネレーター関数で共有されます。その値は Generator.prototype です。 function* 構文またはGeneratorFunction() コンストラクターで生成されるそれぞれのジェネレーター関数も、自身の prototype プロパティを保有します。このプロパティのプロトタイプは GeneratorFunction.prototype.prototype です。ジェネレーター関数が呼び出されると、その prototype プロパティが返されるジェネレーターオブジェクトのプロトタイプとなります。
値
Generator.prototype と同じオブジェクトです。技術的には GeneratorFunction.prototype.prototype の方が正確な名称ですが、Generator.prototype の方がジェネレーターオブジェクトのプロトタイプであるという直感に訴えかけます。
GeneratorFunction.prototype.prototype のプロパティ属性 | |
|---|---|
| 書込可能 | 可 |
| 列挙可能 | 不可 |
| 設定可能 | 不可 |
それぞれの GeneratorFunction インスタンスの prototype プロパティは、プロパティを持たない空のオブジェクトであり、そのプロトタイプは GeneratorFunction.prototype.prototype です。次のプロパティ属性を持っています。
GeneratorFunction.prototype.prototype のプロパティ属性 | |
|---|---|
| 書込可能 | 不可 |
| 列挙可能 | 不可 |
| 設定可能 | 可 |
解説
ジェネレーター関数のインスタンスには 2 つの prototype プロパティがあります。まず 1 つは自身の prototype プロパティです。 2 つ目はそのプロトタイプ(つまり GeneratorFunction.prototype)上の prototype プロパティです。(すべてのジェネレーター関数は GeneratorFunction のインスタンスであるため、そのプロトタイプは GeneratorFunction.prototype であることを思い出してください。)
function* genFunc() {}
const GeneratorFunctionPrototype = Object.getPrototypeOf(genFunc);
console.log(Object.hasOwn(genFunc, "prototype")); // true
console.log(Object.hasOwn(GeneratorFunctionPrototype, "prototype")); // true
ジェネレーター関数が呼び出されると、そのジェネレーター関数の prototype プロパティが、返されるジェネレーターオブジェクトのプロトタイプです。
const gen = genFunc();
const proto = Object.getPrototypeOf;
console.log(proto(gen) === genFunc.prototype); // true
console.log(proto(proto(gen)) === GeneratorFunctionPrototype.prototype); // true
次の図は、ジェネレーター関数とそのインスタンスのプロトタイプチェーンを示しています。それぞれの中空の矢印は継承関係(つまりプロトタイプリンク)を示し、それぞれの実線の矢印はプロパティ関係を示します。 なお、 gen から genFunc にアクセスする方法はありません。両者の間には instanceof 関係のみが存在します。
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-generatorfunction.prototype.prototype> |
| ECMAScript® 2026 Language Specification> # sec-generatorfunction-instances-prototype> |