Signatur
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
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()));
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));
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));
// Wichtig · Fallstricke
- Reihenfolge beachten: Man schreibt
proto.isPrototypeOf(obj), nicht umgekehrt. Vertauschte Argumente sind der häufigste Fehler. - Nicht mit
instanceofverwechseln:Hund.isPrototypeOf(bello)istfalse. Richtig istHund.prototype.isPrototypeOf(bello). - Objekte mit
Object.create(null)erben die Methode nicht. Robuster Code ruft sie deshalb überObject.prototype.isPrototypeOf.call(proto, obj)auf. Das schützt auch vor Objekten, die die Methode überschreiben. - Wird die Methode mit
thisgleichnulloderundefinedaufgerufen, wirft sie einenTypeError. Das passiert aber nur, wennobjectein Objekt ist, denn bei primitiven Werten wird vorher schonfalsezurückgegeben. - Über Realm-Grenzen hinweg (iframes,
vm-Kontexte in Node.js) hat jeder Realm eigene eingebaute Prototypen.Array.prototype.isPrototypeOf(arrAusIframe)ergibt dannfalse. Für Arrays deshalbArray.isArray()verwenden. - Bei Proxys wird die Falle
getPrototypeOfausgelöst.