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 objectToString
i 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″>
typeof
{}.toString
Symbol.toStringTag
instanceof
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.
Skriv et svar