Der instanceof
Operator prüft, ob ein Objekt die prototype Eigenschaft einer Konstruktorfunktion in seiner Prototypenkette besitzt.
Syntax
object instanceof constructor
Parameter
object
- Das zu prüfende Objekt.
constructor
- Gegen die zu testende Funktion.
Beschreibung
Der instanceof
Operator prüft die Anwesenheit des constructor.prototype
in der
Prototypenkette eines Objekts.
// Konstruktoren definieren function C(){} function D(){} var o = new C(); // true, weil: Object.getPrototypeOf(o) === C.prototype o instanceof C; // false, weil D.prototype nirgends in o's Prototypenkette ist o instanceof D; o instanceof Object; // true, weil: C.prototype instanceof Object // true C.prototype = {}; var o2 = new C(); o2 instanceof C; // true // false, weil C.prototype nirgends in // o's Prototypenkette ist o instanceof C; D.prototype = new C(); // Einsatz von Vererbung var o3 = new D(); o3 instanceof D; // true o3 instanceof C; // true
Zu beachten ist, dass sich das Ergebnis des instanceof
Tests ändern kann, wenn die prototype
Eigenschaft eines Konstruktors geändert wird. Das Ergebnis ändert sich nicht wenn der Prototyp eines Objekts geändert wird, weil dieses laut dem ECMAScript-Standard nicht möglich ist. Es ist jedoch möglich die nicht standardisierte Pseudoeigenschaft __proto__
zu nutzen.
instanceof
und verschiedene Kontexte (z. B. Frames oder Windows)
Verschiedene Scopes haben verschiedene Ausführungsumgebungen. Das bedeutet, es sind verschiedene Standardobjekte vorhanden (verschiedene globale Objekte, verschiedene Konstruktoren, etc.). Das führt manchmal zu unerwarteten Resultaten. [] instanceof window.frames[0].Array
ergibt zum Beispiel false
, weil Array.prototype !==
window.frames[0].Array
und Arrays von ihrem Ersteller erben. Auf den ersten Blick ergibt das nicht viel Sinn, fängt man jedoch an Objekte zwischen verschiedenen Frames oder Windows zwischen Kontexten auszutauschen, wäre das valide, aber ein großes Problem. Zum Beispiel kann man mit Sicherheit testen, ob ein Objekt ein Array ist, indem man Array.isArray(myObj)
benutzt.
In Quelltext in dem XPCOM eingesetzt wird, hat
instanceof
einen speziellen Effekt: obj instanceof
xpcomInterface
(z. B. Components.interfaces.nsIFile
) ruft obj.QueryInterface(xpcomInterface)
auf und gibt true
zurück, wenn QueryInterface erfolgreich war. Ein Seiteneffekt eines solchen Aufrufes ist, dass Eigenschaften von xpcomInterface
auf obj
aufgerufen werden können, wenn instanceof
erfolgreich aufgerufen wurde. Anders ist es mit JavaScripts Standardobjekten (globalen), die arbeiten nach dem test obj instanceof xpcomInterface
wie erwartet, auch wenn obj
aus ein anderen Scope stammt.Beispiele
Demonstration, dass String
und Date
vom Typ Object
sind und Ausnahmefälle
Der folgende Quelltext nutzt instanceof
, um zu demonstrieren, dass String
und Date
Objekte von Typ Object
sind (sie sind von Object
abgeleitet).
Immer, wenn ein Objekt durch die Objekt Literal Notation erstellt wird, ist das eine Ausnahme: Auch wenn der Prototype undefined
ist, ergibt instanceof Object
true
.
var simpleStr = "This is a simple string"; var myString = new String(); var newStr = new String("String created with constructor"); var myDate = new Date(); var myObj = {}; simpleStr instanceof String; // gibt false zurück; kontrolliert die Prototypenkette und findet undefined myString instanceof String; // gibt true zurück newStr instanceof String; // gibt true zurück myString instanceof Object; // gibt true zurück myObj instanceof Object; // gibt true zurück, trotz eines undefined Prototypen ({}) instanceof Object; // gibt true zurück, gleicher Fall wie oben myString instanceof Date; // gibt false zurück myDate instanceof Date; // gibt true zurück myDate instanceof Object; // gibt true zurück myDate instanceof String; // gibt false zurück
Demonstration, dass mycar
vom Typ Car
und vom Typ Object
ist
Der folgende Quelltext erstellt ein Objekttyp Car
und einen Instanz dieses Typen, mycar
. Der instanceof
Operator demonstriert, dass das mycar
Objekt vom Typ Car
und Object
ist.
function Car(make, model, year) { this.make = make; this.model = model; this.year = year; } var mycar = new Car("Honda", "Accord", 1998); var a = mycar instanceof Car; // gibt true zurück var b = mycar instanceof Object; // gibt true zurück
Spezifikationen
Spezifikation | Status | Kommentar |
---|---|---|
ECMAScript 2017 Draft (ECMA-262) Die Definition von 'Relational Operators' in dieser Spezifikation. |
Entwurf | |
ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'Relational Operators' in dieser Spezifikation. |
Standard | |
ECMAScript 5.1 (ECMA-262) Die Definition von 'The instanceof operator' in dieser Spezifikation. |
Standard | |
ECMAScript 3rd Edition (ECMA-262) Die Definition von 'The instanceof operator' in dieser Spezifikation. |
Standard | Initiale Definition. Implementiert in JavaScript 1.4. |
Browserkompatibilität
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) | (Ja) |