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 trueom objtillhö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:
förresten finns det också en metod obja.isprototypeof (objB), som returnerar true om objA är någonstans i kedjan av prototyper för objB., Så testet av obj instanceof Class kan omformuleras som Class.prototype.isPrototypeOf(obj).
det är roligt, men Class konstruktören själv deltar inte i kontrollen! Endast kedjan av prototyper och Class.prototype är viktiga.
det kan leda till intressanta konsekvenser när en prototype – egenskap ändras efter att objektet har skapats.
gilla här:
Bonus: objekt.prototypstadiet.,vi vet redan att vanliga objekt konverteras till sträng som:
let obj = {};alert(obj); // alert(obj.toString()); // the same
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 algoritmentoStringthis 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{}.toStringSymbol.toStringTag instanceofAs 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