instanceof operatør giver mulighed for at kontrollere, om et objekt tilhører en bestemt klasse. Det tager også hensyn til arv.

en sådan kontrol kan være nødvendig i mange tilfælde. For eksempel kan den bruges til at opbygge en polymorf funktion, den der behandler argumenter forskelligt afhængigt af deres type.,

instanceof operatoren

syntaks er:

obj instanceof Class

Det returnerer true hvis obj tilhører Class eller en klasse, der arver fra det.,

For eksempel:

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

Det virker også med constructor-funktioner:

// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true

…Og med indbyggede klasser som Array:

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

bemærk at arr også tilhører Object class., Det skyldes, at Array prototypisk arver fraObject.

normalt undersøger instanceof prototypekæden til kontrollen. Vi kan også indstille en brugerdefineret logik i den statiske metode Symbol.hasInstance.,

Den algoritme obj instanceof Class fungerer nogenlunde som følger:

Her er en illustration af, hvad rabbit instanceof Animal sammenlignet med Animal.prototype:

Ved den måde, er der også en metode, der objA.isPrototypeOf(objB), der returnerer true hvis objA er et eller andet sted i kæden af prototyper for objB., Så testen af obj instanceof Class kan omformuleres som Class.prototype.isPrototypeOf(obj).

det er sjovt, men Class konstruktøren selv deltager ikke i checken! Kun kæden af prototyper og Class.prototype betyder noget.

det kan føre til interessante konsekvenser, når en prototype ejendom ændres, når objektet er oprettet.

ligesom her:

Bonus: objekt.prototype.,toString for den type

Vi allerede ved, at almindelig objekter, bliver konverteret til en streng som :

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

Det er deres implementering af toString. Men der er en skjult funktion, der gør toString faktisk meget mere kraftfuld end det. Vi kan bruge det som en udvidet typeof og et alternativ til instanceof.

lyder mærkeligt? Faktisk. Lad os afmystificere.,

efter specifikation kan den indbyggede toString udvindes fra objektet og udføres i sammenhæng med enhver anden værdi. Og dens resultat afhænger af denne værdi.

lad os demonstrere:

Her brugte vi opkald som beskrevet i kapitlet dekoratører og videresendelse, ring/Anvend for at udføre funktionen objectToStringi sammenhængen this=arr.

internt undersøgertoString algoritmenthis og returnerer det tilsvarende resultat. Flere eksempler:

Symbol.,toStringTag

objektets opførsel toString kan tilpasses ved hjælp af en speciel objektegenskab Symbol.toStringTag.

For eksempel:

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

For de fleste miljø-specifikke objekter, der er sådan en ejendom. Her er nogle bro .serspecifikke eksempler:

som du kan se, er resultatet nøjagtigt Symbol.toStringTag (hvis findes), indpakket i .,

i slutningen har vi “typeof på steroider”, der ikke kun fungerer for primitive datatyper, men også for indbyggede objekter og endda kan tilpasses.

Vi kan bruge {}.toString.call i stedet for instanceof for indbyggede objekter, når vi ønsker at få den type, som en streng i stedet for bare at kontrollere.,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.,

oginstanceof operatør skinner virkelig, når vi arbejder med et klassehierarki og vil tjekke for klassen under hensyntagen til arv.