instanceof
operatør gjør det mulig å undersøke om en gjenstand som tilhører en bestemt klasse. Det tar også arv i betraktning.
en Slik sjekk kan være nødvendig i mange tilfeller. Det kan For eksempel brukes for å bygge en polymorf-funksjonen, som behandler argumenter forskjellig avhengig av sin type.,
operatoren instanceof
syntaksen er:
obj instanceof Class
tilbake true
hvis obj
tilhører Class
eller en klasse som arver fra det.,
For eksempel:
class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true
Det fungerer også med constructor funksjoner:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
…Og med innebygd klasser som Array
:
let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true
Vær oppmerksom på at arr
hører også til Object
klasse., Det er fordi Array
prototypically arver fra Object
.
Vanligvis instanceof
undersøker prototypen kjede for sjekk. Vi kan også angi en tilpasset logikken i den statiske metoden Symbol.hasInstance
.,
algoritmen av obj instanceof Class
fungerer omtrent som følger:
Her er en illustrasjon av hva som rabbit instanceof Animal
sammenligner med Animal.prototype
:
forresten, det er også en metode objA.isPrototypeOf(objB), som returnerer true
hvis objA
er et sted i kjeden av prototyper for objB
., Så testen av obj instanceof Class
kan være rephrased som Class.prototype.isPrototypeOf(obj)
.
Det er morsomt, men Class
constructor seg selv ikke delta i sjekk! Bare kjedet av prototyper og Class.prototype
saker.
Som kan føre til interessante konsekvensene når en prototype
eiendom er endret etter at objektet er opprettet.
slik Som her:
– Bonus: Objekt.prototype.,toString for den type
Vi allerede vet at vanlig objekter skal konverteres til en streng som :
let obj = {};alert(obj); // alert(obj.toString()); // the same
Det er deres gjennomføring av toString
. Men det er en skjult funksjon som gjør toString
faktisk mye mer kraftig enn det. Vi kan bruke det som en utvidet typeof
og et alternativ for instanceof
.
Høres det rart ut? Faktisk. La oss avmystifisere.,
Etter spesifikasjon, den innebygde toString
kan trekkes ut fra objektet og utføres i sammenheng med andre verdier. Og resultatet avhenger av at verdien.
La oss vise:
Her har vi brukt samtale som beskrevet i kapittel Dekoratører og viderekobling, samtale/gjelder å kjøre funksjonen objectToString
i sammenheng this=arr
.
Internt toString
algoritme undersøker this
og gir tilsvarende resultat. Flere eksempler:
Symbolet.,toStringTag
virkemåten til Objektet. toString
kan tilpasses ved hjelp av en spesiell gjenstand eiendel Symbol.toStringTag
.
For eksempel:
let user = { : "User"};alert( {}.toString.call(user) ); //
For de fleste miljø-spesifikke objekter, det er slik en eiendom. Her er noen nettleser-spesifikke eksempler:
Som du kan se, resultatet er nøyaktig Symbol.toStringTag
(hvis det finnes), innpakket i .,
På slutten har vi «typeof på steroider» som ikke bare fungerer for primitive datatyper, men også for innebygde objekter og selv kan tilpasses.
Vi kan bruke {}.toString.call
i stedet for instanceof
for innebygde objekter når vi ønsker å få den typen som en streng snarere enn bare å sjekke.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
As we can see, {}.toString
is technically a «more advanced” typeof
.,
Og instanceof
operatør virkelig skinner når vi arbeider med en klasse hierarkiet, og ønsker å se etter den klasse som tar hensyn til arv.
Legg igjen en kommentar