Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Der instanceof Operator testet, ob die prototype Eigenschaft eines Konstruktors irgendwo in der Prototypenkette eines Objekts erscheint. Der Rückgabewert ist ein boolescher Wert. Sein Verhalten kann mit Symbol.hasInstance angepasst werden.
Das zu testende Objekt.
constructorKonstruktor, gegen den getestet werden soll.
Wird ausgelöst, wenn constructor kein Objekt ist. Wenn constructor keine [Symbol.hasInstance]() Methode hat, muss es auch eine Funktion sein.
Der instanceof Operator überprüft das Vorhandensein von constructor.prototype in der Prototypenkette von object. Dies bedeutet normalerweise (aber nicht immer), dass object mit constructor konstruiert wurde.
Beachten Sie, dass sich der Wert eines instanceof Tests ändern kann, wenn constructor.prototype neu zugewiesen wird, nachdem das Objekt erstellt wurde (was normalerweise nicht empfohlen wird). Er kann auch geändert werden, indem der Prototyp von object mit Object.setPrototypeOf geändert wird.
Klassen verhalten sich auf die gleiche Weise, da Klassen auch die prototype Eigenschaft haben.
Für gebundene Funktionen sucht instanceof nach der prototype Eigenschaft in der Zielfunktion, da gebundene Funktionen kein prototype haben.
Wenn constructor eine Symbol.hasInstance Methode hat, wird die Methode vorrangig aufgerufen, mit object als einzigem Argument und constructor als this.
Da alle Funktionen standardmäßig von Function.prototype erben, legt die Function.prototype[Symbol.hasInstance]() Methode die meiste Zeit das Verhalten von instanceof fest, wenn die rechte Seite eine Funktion ist. Siehe die Symbol.hasInstance Seite für den genauen Algorithmus von instanceof.
JavaScript Ausführungsumgebungen (Fenster, Frames usw.) befinden sich jeweils in ihrem eigenen Realm. Dies bedeutet, dass sie unterschiedliche Built-ins haben (unterschiedliches globales Objekt, unterschiedliche Konstruktoren usw.). Dies kann zu unerwarteten Ergebnissen führen. Zum Beispiel wird [] instanceof window.frames[0].Array false zurückgeben, da Array.prototype !== window.frames[0].Array.prototype und Arrays im aktuellen Realm vom früheren erben.
Dies mag zuerst keinen Sinn ergeben, aber für Skripte, die mit mehreren Frames oder Fenstern arbeiten und Objekte über Funktionen von einem Kontext in einen anderen übergeben, wird dies ein gültiges und bedeutendes Problem sein. Beispielsweise können Sie sicher überprüfen, ob ein gegebenes Objekt tatsächlich ein Array ist, indem Sie Array.isArray() verwenden, unabhängig davon, aus welchem Realm es stammt.
Um beispielsweise zu überprüfen, ob ein Node ein SVGElement in einem anderen Kontext ist, können Sie myNode instanceof myNode.ownerDocument.defaultView.SVGElement verwenden.
Das folgende Beispiel zeigt das Verhalten von instanceof mit String Objekten.
Das folgende Beispiel zeigt das Verhalten von instanceof mit Map Objekten.
Das folgende Beispiel zeigt das Verhalten von instanceof mit Objekten, die mit Object.create() erstellt wurden.
Der folgende Code erstellt einen Objekttyp Car und eine Instanz dieses Objekttyps, myCar. Der instanceof Operator zeigt, dass das myCar Objekt vom Typ Car und vom Typ Object ist.
Um zu testen, ob ein Objekt kein instanceof eines spezifischen Konstruktors ist, können Sie folgendes tun:
Dies ist wirklich anders als:
Dies wird immer false sein. (!myCar wird vor instanceof ausgewertet, daher versuchen Sie immer, zu wissen, ob ein boolescher Wert eine Instanz von Car ist).
Ein häufiger Trugschluss bei der Verwendung von instanceof ist der Glaube, dass, wenn x instanceof C, x mit C als Konstruktor erstellt wurde. Das ist nicht wahr, denn x könnte direkt mit C.prototype als seinem Prototyp zugewiesen worden sein. In diesem Fall würde das Lesen von privaten Feldern von C aus x immer noch fehlschlagen:
Um dies zu vermeiden, können Sie das Verhalten von instanceof überschreiben, indem Sie eine Symbol.hasInstance Methode zu C hinzufügen, sodass es eine markenbasierte Überprüfung mit in durchführt:
Beachten Sie, dass Sie dieses Verhalten möglicherweise auf die aktuelle Klasse beschränken möchten; andernfalls könnte es zu falschen positiven Ergebnissen für Unterklassen führen:
Sie könnten dies tun, indem Sie prüfen, ob this der aktuelle Konstruktor ist:
| ECMAScript® 2027 Language Specification # sec-relational-operators |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.