instanceof

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.

Hinweis for Mozilla Entwickler:
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)

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

 Mitwirkende an dieser Seite: flipace, schlagi123, weedukind
 Zuletzt aktualisiert von: flipace,