L’operatoreinstanceof
consente di verificare se un oggetto appartiene a una determinata classe. Prende anche in considerazione l’ereditarietà.
Tale controllo può essere necessario in molti casi. Ad esempio, può essere utilizzato per costruire una funzione polimorfica, quella che tratta gli argomenti in modo diverso a seconda del loro tipo.,
L’operatore instanceof
La sintassi è:
obj instanceof Class
torna true
se obj
appartiene alla Class
o una classe che eredita da esso.,
Per esempio:
class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true
funziona anche con le funzioni di costruzione:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
…E con built-in classi come Array
:
let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true
si Prega di notare che arr
appartiene anche il Object
classe., Questo perchéArray
eredita prototipicamente daObject
.
Normalmente, instanceof
esamina la catena del prototipo per il controllo. Possiamo anche impostare una logica personalizzata nel metodo statico Symbol.hasInstance
.,
L’algoritmo di obj instanceof Class
funziona all’incirca come segue:
di seguito l’illustrazione di ciò che un rabbit instanceof Animal
confronta con Animal.prototype
:
a proposito, c’è anche un metodo objA.isPrototypeOf (objB), che restituisce true
se objA
è da qualche parte nella catena di prototipi per objB
., Quindi il test di obj instanceof Class
può essere riformulato comeClass.prototype.isPrototypeOf(obj)
.
È divertente, ma il costruttoreClass
non partecipa al controllo! Solo la catena di prototipi e Class.prototype
conta.
Ciò può portare a conseguenze interessanti quando una proprietàprototype
viene modificata dopo la creazione dell’oggetto.
Come qui:
Bonus: Oggetto.prototipo.,toString per il tipo
sappiamo già che la pianura oggetti vengono convertiti in stringa :
let obj = {};alert(obj); // alert(obj.toString()); // the same
Che la loro attuazione di toString
. Ma c’è una caratteristica nascosta che rende toString
in realtà molto più potente di quello. Possiamo usarlo come un esteso typeof
e un’alternativa per instanceof
.
Suona strano? Infatti. Demistifichiamo.,
Per specifica, il built-intoString
può essere estratto dall’oggetto ed eseguito nel contesto di qualsiasi altro valore. E il suo risultato dipende da quel valore.
Dimostriamo:
Qui abbiamo usato call come descritto nel capitolo Decoratori e inoltro, call/apply per eseguire la funzioneobjectToString
nel contestothis=arr
.
Internamente, l’algoritmotoString
esaminathis
e restituisce il risultato corrispondente. Altri esempi:
Simbolo.,toStringTag
Il comportamento dell’oggettotoString
può essere personalizzato utilizzando una speciale proprietà dell’oggettoSymbol.toStringTag
.
Ad esempio:
let user = { : "User"};alert( {}.toString.call(user) ); //
Per la maggior parte degli oggetti specifici dell’ambiente, esiste una tale proprietà. Ecco alcuni esempi specifici del browser:
Come puoi vedere, il risultato è esattamente Symbol.toStringTag
(se esiste), avvolto in .,
Alla fine abbiamo “typeof su steroidi” che non funziona solo per i tipi di dati primitivi, ma anche per gli oggetti incorporati e può anche essere personalizzato.
Possiamo usare{}.toString.call
invece diinstanceof
per gli oggetti incorporati quando vogliamo ottenere il tipo come stringa piuttosto che solo per controllare.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
As we can see, {}.toString
is technically a “more advanced” typeof
.,
E instanceof
l’operatore brilla davvero quando stiamo lavorando con una gerarchia di classi e vogliamo controllare la classe tenendo conto dell’ereditarietà.
Lascia un commento