Mit dem Operator instanceof kann überprüft werden, ob ein Objekt zu einer bestimmten Klasse gehört. Es berücksichtigt auch die Vererbung.

Eine solche Überprüfung kann in vielen Fällen notwendig sein. Zum Beispiel kann es zum Erstellen einer polymorphen Funktion verwendet werden, die Argumente je nach Typ unterschiedlich behandelt.,

Die instanceof operator

Die syntax ist:

obj instanceof Class

Es gibt true wenn obj gehört zu der Class oder eine Klasse, die davon erbt.,

Zum Beispiel:

class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true

Es funktioniert auch mit Konstruktorfunktionen:

…Und mit eingebauten Klassen wie Array:

let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true

Bitte beachten Sie, dassarrauch zurObject Klasse., Das liegt daran, dass Array prototypisch von Objecterbt.

Normalerweise untersucht instanceof die Prototypkette für die Prüfung. Wir können auch eine benutzerdefinierte Logik in der statischen Methode Symbol.hasInstance.,

Der Algorithmus von obj instanceof Class funktioniert ungefähr wie folgt:

Hier ist die Abbildung dessen, was rabbit instanceof Animal mit Animal.prototypevergleicht:

Übrigens gibt es auch eine Methode objA.isPrototypeOf (objB), das true wenn objA irgendwo in der Prototypenkette für objB., Der Test von obj instanceof Class kann also als Class.prototype.isPrototypeOf(obj)umformuliert werden.

Es ist lustig, aber der Class Konstruktor selbst nimmt nicht an der Prüfung teil! Nur die Kette von Prototypen und Class.prototype ist wichtig.

Das kann zu interessanten Konsequenzen führen, wenn eineprototype Eigenschaft nach dem Erstellen des Objekts geändert wird.

Wie hier:

Bonus: Objekt.Prototyp.,toString für den Typ

Wir wissen bereits, dass plain Objekte konvertiert werden zu einem string wie :

let obj = {};alert(obj); // alert(obj.toString()); // the same

Das ist Ihre Umsetzung toString. Aber es gibt eine versteckte Funktion, die toString tatsächlich viel mächtiger macht. Wir können es als erweiterte typeof und als Alternative für instanceofverwenden.

Klingt komisch? Tatsächlich. Lassen Sie uns entmystifizieren.,

Nach Spezifikation kann die integrierte toString aus dem Objekt extrahiert und im Kontext eines anderen Werts ausgeführt werden. Und sein Ergebnis hängt von diesem Wert ab.

Demonstrieren wir:

Hier haben wir call wie im Kapitel Decorators und forwarding beschrieben verwendet, call/apply um die Funktion objectToString im Kontext this=arrauszuführen.

Intern untersucht dertoString Algorithmusthis und gibt das entsprechende Ergebnis zurück. Weitere Beispiele:

Symbol.,toStringTag

Das Verhalten von Object toString kann mit einer speziellen Objekteigenschaft Symbol.toStringTagangepasst werden.

Zum Beispiel:

let user = { : "User"};alert( {}.toString.call(user) ); // 

Für die meisten Umwelt-Objekten, es ist eine solche Eigenschaft. Hier sind einige browserspezifische Beispiele:

Wie Sie sehen, ist das Ergebnis genau Symbol.toStringTag (falls vorhanden), verpackt in .,

Am Ende haben wir „typeof on steroids“, das nicht nur für primitive Datentypen, sondern auch für integrierte Objekte funktioniert und sogar angepasst werden kann.

Wir können {}.toString.call anstelle von instanceof für integrierte Objekte verwenden, wenn wir den Typ als Zeichenfolge abrufen und nicht nur überprüfen möchten.,4012″>

works for returns typeof primitives string {}.toString primitives, built-in objects, objects with Symbol.toStringTag string instanceof objects true/false

As we can see, {}.toString is technically a „more advanced” typeof.,

Und instanceof Operator glänzt wirklich, wenn wir mit einer Klassenhierarchie arbeiten und unter Berücksichtigung der Vererbung nach der Klasse suchen möchten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.