Signatur
Beschreibung
GeneratorFunction.prototype.prototype ist das eingebaute Objekt, das in der Spezifikation %GeneratorPrototype% heißt und oft als Generator.prototype bezeichnet wird. Darauf liegen die Methoden, die jedes Generator-Objekt hat: next(), return() und throw(). Außerdem gehört dazu das Symbol Symbol.toStringTag mit dem Wert "Generator".
Jede Generatorfunktion (function* name() {}) bekommt ein eigenes prototype-Objekt, dessen Prototyp GeneratorFunction.prototype.prototype ist. Beim Aufruf einer Generatorfunktion entsteht ein Generator-Objekt, das von name.prototype erbt. So ergibt sich diese Prototypkette:
generatorObjekt→name.prototype→GeneratorFunction.prototype.prototype→Iterator.prototype→Object.prototype
Im Alltag braucht man diese Eigenschaft selten direkt. Nützlich ist sie für Metaprogrammierung, zum Prüfen, ob ein Objekt ein echter Generator ist, und zum Verständnis der Vererbung. Der Konstruktor GeneratorFunction ist nicht global verfügbar. Man kommt über Object.getPrototypeOf(function* () {}).constructor an ihn heran.
Rückgabewert
%GeneratorPrototype%) mit den Methoden next, return und throw. Die Eigenschaft ist nicht schreibbar und nicht aufzählbar, aber konfigurierbar.Beispiele
An GeneratorFunction und den gemeinsamen Prototyp kommen
// GeneratorFunction ist nicht global – so erreicht man den Konstruktor
const GeneratorFunction = Object.getPrototypeOf(function* () {}).constructor;
const GeneratorPrototype = GeneratorFunction.prototype.prototype;
console.log(Object.getOwnPropertyNames(GeneratorPrototype));
console.log(GeneratorPrototype[Symbol.toStringTag]);
Die Prototypkette eines Generator-Objekts prüfen
const GeneratorFunction = Object.getPrototypeOf(function* () {}).constructor;
function* zaehler(max) {
for (let i = 1; i <= max; i++) yield i;
}
const it = zaehler(3);
console.log(Object.getPrototypeOf(it) === zaehler.prototype);
console.log(Object.getPrototypeOf(zaehler.prototype) === GeneratorFunction.prototype.prototype);
console.log(it.next === GeneratorFunction.prototype.prototype.next);
Echte Generator-Objekte erkennen
const GeneratorPrototype = Object.getPrototypeOf(function* () {}).constructor.prototype.prototype;
const istGenerator = (wert) =>
wert !== null && typeof wert === 'object' && GeneratorPrototype.isPrototypeOf(wert);
function* ids() { yield 'a'; }
const eigenerIterator = { next: () => ({ done: true, value: undefined }) };
console.log(istGenerator(ids()));
console.log(istGenerator(eigenerIterator));
console.log(istGenerator([1, 2].values()));
Eigenschafts-Deskriptor ansehen
const GeneratorFunction = Object.getPrototypeOf(function* () {}).constructor;
const { writable, enumerable, configurable } =
Object.getOwnPropertyDescriptor(GeneratorFunction.prototype, 'prototype');
console.log({ writable, enumerable, configurable });
// Wichtig · Fallstricke
- Keine globale Variable: Weder
GeneratorFunctionnochGeneratorgibt es als globale Bezeichner. Man erreicht sie nur überObject.getPrototypeOf(...). - Nicht mit
genFn.prototypeverwechseln: Jede Generatorfunktion hat ihr eigenesprototype-Objekt. Nur dessen Prototyp ist das gemeinsameGeneratorFunction.prototype.prototype. Anders als bei normalen Funktionen hatgenFn.prototypekeine Eigenschaftconstructor. Generatorfunktionen lassen sich außerdem nicht mitnewaufrufen (das löst einenTypeErroraus). - Die Eigenschaft ist schreibgeschützt: Eine Zuweisung an
GeneratorFunction.prototype.prototypewird im nicht-strikten Modus stillschweigend ignoriert. Im strikten Modus löst sie einenTypeErroraus. - Vorsicht beim Monkey-Patching: Methoden, die man auf diesem Objekt ergänzt, gelten für alle Generatoren im gesamten Realm, auch für die in Fremdbibliotheken. Für Hilfsfunktionen wie
mapodertakesollte man besser die Iterator-Helfer aufIterator.prototypeverwenden (ES2025, in modernen Browsern und ab Node.js 22 verfügbar). - Realm-Grenzen: Generatoren aus iframes oder
vm-Kontexten haben ihren eigenen%GeneratorPrototype%. Eine Prüfung mitisPrototypeOfschlägt bei ihnen deshalb fehl. - Async-Generatoren verwenden ein eigenes Objekt:
AsyncGeneratorFunction.prototype.prototype. - Browser-Unterstützung: Alle modernen Browser und Node.js unterstützen die Eigenschaft (Baseline seit ES2015).