instanceof
– operatören tillåter att kontrollera om ett objekt tillhör en viss klass. Det tar också hänsyn till arv.
en sådan kontroll kan i många fall vara nödvändig. Det kan till exempel användas för att bygga en polymorf funktion, den som behandlar argument olika beroende på deras typ.,
instanceof operator
syntaxen är:
obj instanceof Class
den returnerar true
om obj
tillhör Class
eller en klass som ärver från den.,
till exempel:
class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true
det fungerar också med konstruktörsfunktioner:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
…Och med inbyggda klasser som Array
:
let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true
Observera att arr
också tillhör Object
klass., Det beror på attArray
prototypiskt ärver frånObject
.
normalt undersökerinstanceof
prototypkedjan för kontrollen. Vi kan också ställa in en anpassad logik i den statiska metoden Symbol.hasInstance
.,
algoritmen för obj instanceof Class
fungerar ungefär som följer:
här är illustrationen av vad rabbit instanceof Animal
jämför med Animal.prototype
:
det är deras genomförande av toString
. Men det finns en dold funktion som gör toString
faktiskt mycket kraftfullare än så. Vi kan använda den som ett utökat typeof
och ett alternativ för instanceof
.
låter konstigt? Verkligen. Låt oss avmystifiera.,
efter specifikation kan den inbyggda toString
extraheras från objektet och exekveras i samband med något annat värde. Och resultatet beror på det värdet.
låt oss visa:
här använde vi samtal som beskrivs i kapitlet dekoratörer och vidarebefordran, Ring/använd för att utföra funktionen objectToString
I sammanhanget this=arr
.
Internt undersöker algoritmentoString
this
och returnerar motsvarande resultat. Fler exempel:
Symbol.,tostringtag
beteendet hos objektettoString
kan anpassas med hjälp av en speciell objektegenskapSymbol.toStringTag
.
till exempel:
let user = { : "User"};alert( {}.toString.call(user) ); //
för de flesta miljöspecifika objekt finns det en sådan egenskap. Här är några webbläsarspecifika exempel:
som du kan se är resultatet exakt Symbol.toStringTag
(om det finns), insvept i .,
i slutet har vi ”typeof on steroids” som inte bara fungerar för primitiva datatyper, men också för inbyggda objekt och även kan anpassas.
vi kan använda{}.toString.call
istället förinstanceof
för inbyggda objekt när vi vill få typen som en sträng snarare än att bara kontrollera.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
As we can see, {}.toString
is technically a ”more advanced” typeof
.,
ochinstanceof
operatören lyser verkligen när vi arbetar med en klasshierarki och vill kontrollera för klassen med hänsyn till arv.
Lämna ett svar