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, dassarr
auch zurObject
Klasse., Das liegt daran, dass Array
prototypisch von Object
erbt.
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.prototype
vergleicht:
Ü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 instanceof
verwenden.
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=arr
auszufü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.toStringTag
angepasst 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″>
typeof
{}.toString
Symbol.toStringTag
instanceof
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