Start · Sprachen · JavaScript · Referenz · Object.prototype.isPrototypeOf()

Object.prototype.isPrototypeOf()

Methode

Prüft, ob das aufrufende Objekt irgendwo in der Prototypenkette von <code>object</code> vorkommt, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript ES3 (Baseline: alle Browser) Kategorie: method-property

Signatur

Object.prototype.isPrototypeOf(object)

Beschreibung

isPrototypeOf() läuft die Prototypenkette des übergebenen Objekts (über [[Prototype]], also das, was Object.getPrototypeOf() liefert) nach oben ab und prüft, ob das Objekt, auf dem die Methode aufgerufen wird, dabei vorkommt. Geprüft wird die gesamte Kette, nicht nur der direkte Prototyp.

Der Unterschied zum Operator instanceof: obj instanceof Ctor prüft gegen Ctor.prototype und braucht deshalb eine Konstruktorfunktion. proto.isPrototypeOf(obj) arbeitet direkt mit dem Prototyp-Objekt. Das ist praktisch bei Objekten, die mit Object.create() erzeugt wurden und keinen Konstruktor haben. Außerdem wird hier Symbol.hasInstance nicht beachtet, eigene Logik kann das Ergebnis also nicht verfälschen.

Typische Einsatzfälle sind Typprüfungen in Bibliotheken, Prüfungen bei prototypbasierter Vererbung ohne Klassen und das Debuggen von Vererbungsketten. Ist object kein Objekt (also ein primitiver Wert), gibt die Methode immer false zurück, ohne einen Fehler zu werfen.

Parameter

Name Typ Default Beschreibung
$object Pflicht any Das Objekt, dessen Prototypenkette durchsucht wird. Bei primitiven Werten ist das Ergebnis immer false.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das aufrufende Objekt in der Prototypenkette von object vorkommt, sonst false.

Beispiele

Vererbungskette mit Klassen prüfen

class Tier {}
class Hund extends Tier {}
const bello = new Hund();

console.log(Hund.prototype.isPrototypeOf(bello));   // direkter Prototyp
console.log(Tier.prototype.isPrototypeOf(bello));   // weiter oben in der Kette
console.log(Object.prototype.isPrototypeOf(bello));
console.log(Hund.prototype.isPrototypeOf(new Tier()));
true true true false

Objekte aus Object.create() ohne Konstruktor

const basisLogger = {
  log(msg) { console.log(`[${this.name}] ${msg}`); }
};
const apiLogger = Object.create(basisLogger, { name: { value: 'API' } });
const dbLogger = Object.create(apiLogger, { name: { value: 'DB' } });

// instanceof ginge hier nicht, weil es keinen Konstruktor gibt
console.log(basisLogger.isPrototypeOf(dbLogger));
console.log(dbLogger.isPrototypeOf(basisLogger));
true false

Sichere Typprüfung und primitive Werte

const istArrayAehnlich = (wert) =>
  Object.prototype.isPrototypeOf.call(Array.prototype, wert);

console.log(istArrayAehnlich([1, 2, 3]));
console.log(istArrayAehnlich('abc'));   // primitiv → false
console.log(istArrayAehnlich(null));

// Objekt ohne Prototyp: die Methode steht nicht direkt zur Verfügung
const dict = Object.create(null);
console.log(typeof dict.isPrototypeOf);
console.log(Object.prototype.isPrototypeOf.call(Object.prototype, dict));
true false false undefined false

// Wichtig · Fallstricke

  • Reihenfolge beachten: Man schreibt proto.isPrototypeOf(obj), nicht umgekehrt. Vertauschte Argumente sind der häufigste Fehler.
  • Nicht mit instanceof verwechseln: Hund.isPrototypeOf(bello) ist false. Richtig ist Hund.prototype.isPrototypeOf(bello).
  • Objekte mit Object.create(null) erben die Methode nicht. Robuster Code ruft sie deshalb über Object.prototype.isPrototypeOf.call(proto, obj) auf. Das schützt auch vor Objekten, die die Methode überschreiben.
  • Wird die Methode mit this gleich null oder undefined aufgerufen, wirft sie einen TypeError. Das passiert aber nur, wenn object ein Objekt ist, denn bei primitiven Werten wird vorher schon false zurückgegeben.
  • Über Realm-Grenzen hinweg (iframes, vm-Kontexte in Node.js) hat jeder Realm eigene eingebaute Prototypen. Array.prototype.isPrototypeOf(arrAusIframe) ergibt dann false. Für Arrays deshalb Array.isArray() verwenden.
  • Bei Proxys wird die Falle getPrototypeOf ausgelöst.