Signatur
Beschreibung
Reflect.getPrototypeOf() liest den Prototyp eines Objekts aus, also das Objekt, von dem es Eigenschaften und Methoden erbt. Die Methode entspricht der internen Operation [[GetPrototypeOf]] und macht dasselbe wie Object.getPrototypeOf(), ist aber strenger: Primitive Werte werden nicht in Objekte umgewandelt, sondern führen zu einem TypeError.
Am meisten bringt die Methode innerhalb von Proxy-Handlern. Dort leitet man mit ihr die Trap getPrototypeOf sauber an das Originalobjekt weiter. Genauso wie die anderen Reflect-Methoden passt ihre Signatur genau zur zugehörigen Proxy-Trap.
In der Praxis nutzt man sie, um Prototypketten zu untersuchen (etwa für Debugging-Werkzeuge, Serialisierer oder eigene instanceof-Prüfungen) und um festzustellen, ob ein Objekt ein „reines" Objekt ist, dessen Prototyp Object.prototype oder null ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $target Pflicht | object | Das Objekt, dessen Prototyp ermittelt werden soll. Es muss ein Objekt sein, auch eine Funktion oder ein Proxy ist möglich. Primitive Werte lösen einen TypeError aus. |
Rückgabewert
target oder null, wenn das Objekt keinen Prototyp hat (z. B. bei Object.create(null) oder Object.prototype).Beispiele
Grundlegende Nutzung
class Tier {}
class Hund extends Tier {}
const bello = new Hund();
console.log(Reflect.getPrototypeOf(bello) === Hund.prototype);
console.log(Reflect.getPrototypeOf(Hund.prototype) === Tier.prototype);
console.log(Reflect.getPrototypeOf(Object.create(null)));
Prototypkette vollständig durchlaufen
const getPrototypeChain = (obj) => {
const chain = [];
let proto = Reflect.getPrototypeOf(obj);
while (proto !== null) {
chain.push(proto.constructor?.name ?? '(anonym)');
proto = Reflect.getPrototypeOf(proto);
}
return chain;
};
console.log(getPrototypeChain(new Map()));
console.log(getPrototypeChain([]));
Weiterleitung in einer Proxy-Trap
const ziel = new Date();
const proxy = new Proxy(ziel, {
getPrototypeOf(target) {
console.log('Prototyp wird abgefragt');
return Reflect.getPrototypeOf(target);
}
});
console.log(proxy instanceof Date);
Unterschied zu Object.getPrototypeOf bei Primitiven
console.log(Object.getPrototypeOf('abc') === String.prototype);
try {
Reflect.getPrototypeOf('abc');
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Strenge Typprüfung: Anders als
Object.getPrototypeOf()(seit ES2015) wandeltReflect.getPrototypeOf()Primitive wie Zeichenketten oder Zahlen nicht in Objekte um, sondern wirft einenTypeError. Beinull/undefinedwerfen beide Methoden. - Proxy-Invarianten: Ist das Zielobjekt nicht erweiterbar (
Object.preventExtensions), muss die TrapgetPrototypeOfden echten Prototyp zurückgeben. Sonst entsteht einTypeError. - Nicht mit
__proto__verwechseln: Der Accessor__proto__ist veraltet und bei Objekten ausObject.create(null)gar nicht vorhanden.Reflect.getPrototypeOf()funktioniert dagegen immer. - Keine Aussage über den „Typ": Objekte aus einem anderen Realm (etwa aus einem iframe) haben einen anderen
Array.prototype. Für solche Prüfungen istArray.isArray()zuverlässiger. - Kompatibilität: Wird von allen modernen Browsern und von Node.js ab Version 6 unterstützt, aber nicht vom Internet Explorer.