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″>