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 Classpuò 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’oggettotoStringpuò 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″>

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

E instanceof l’operatore brilla davvero quando stiamo lavorando con una gerarchia di classi e vogliamo controllare la classe tenendo conto dell’ereditarietà.