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

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.,

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.