Start · Sprachen · JavaScript · Referenz · Reflect.getPrototypeOf()

Reflect.getPrototypeOf()

Methode

Gibt den Prototyp (internes <code>[[Prototype]]</code>) des Zielobjekts zurück oder <code>null</code>. Wirft einen <code>TypeError</code>, wenn das Ziel kein Objekt ist.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Reflect.getPrototypeOf(target)

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

Typ
object | null
Beschreibung
Der Prototyp von 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)));
true true 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([]));
[ 'Map', 'Object' ] [ 'Array', 'Object' ]

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);
Prototyp wird abgefragt true

Unterschied zu Object.getPrototypeOf bei Primitiven

console.log(Object.getPrototypeOf('abc') === String.prototype);

try {
  Reflect.getPrototypeOf('abc');
} catch (err) {
  console.log(err.name);
}
true TypeError

// Wichtig · Fallstricke

  • Strenge Typprüfung: Anders als Object.getPrototypeOf() (seit ES2015) wandelt Reflect.getPrototypeOf() Primitive wie Zeichenketten oder Zahlen nicht in Objekte um, sondern wirft einen TypeError. Bei null/undefined werfen beide Methoden.
  • Proxy-Invarianten: Ist das Zielobjekt nicht erweiterbar (Object.preventExtensions), muss die Trap getPrototypeOf den echten Prototyp zurückgeben. Sonst entsteht ein TypeError.
  • Nicht mit __proto__ verwechseln: Der Accessor __proto__ ist veraltet und bei Objekten aus Object.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 ist Array.isArray() zuverlässiger.
  • Kompatibilität: Wird von allen modernen Browsern und von Node.js ab Version 6 unterstützt, aber nicht vom Internet Explorer.