operatorul instanceof permite verificarea dacă un obiect aparține unei anumite clase. De asemenea, ia în considerare moștenirea.o astfel de verificare poate fi necesară în multe cazuri. De exemplu, poate fi folosit pentru construirea unei funcții polimorfe, cea care tratează argumentele diferit în funcție de tipul lor.,

operatorul instanceof

sintaxa este:

obj instanceof Class

Se revine true dacă obj aparține Class sau o clasă moștenește de la acesta.,

De exemplu:

class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true

de asemenea, funcționează cu constructorul funcții:

// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true

…Și cu built-in clase, cum ar fi Array:

let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true

vă Rugăm să rețineți că arr, de asemenea, aparține Object clasa., Asta pentru că Array prototypically moștenește de la Object.

în mod normal, instanceof examinează lanțul prototip pentru verificare. De asemenea, putem seta o logică personalizată în metoda statică Symbol.hasInstance.,

algoritmul de obj instanceof Class funcționează aproximativ după cum urmează:

Aici e o ilustrare a ceea ce rabbit instanceof Animal compară cu Animal.prototype:

apropo, există, de asemenea, o metodă objA.isPrototypeOf(objB), care returnează true dacă objA este undeva în lanțul de prototipuri pentru objB., Deci testul obj instanceof Classpoate fi reformulat ca Class.prototype.isPrototypeOf(obj).

este amuzant, dar Class constructorul în sine nu participă la verificare! Numai lanțul de prototipuri și Class.prototype contează.

care poate duce la consecințe interesante atunci când un prototype proprietate este schimbat după ce obiectul este creat.

ca aici:

Bonus: obiect.prototip.,toString pentru tip

stim deja ca simple obiecte sunt convertite la șirul :

let obj = {};alert(obj); // alert(obj.toString()); // the same

este punerea lor în aplicare de toString. Dar există o caracteristică ascunsă care face toString de fapt mult mai puternic decât atât. Putem folosi ca un Extins typeofși o alternativă pentru instanceof.

sună ciudat? Într-adevăr. Să demistificăm.,

prin specificație, built-in toString poate fi extras din obiect și executat în contextul oricărei alte valori. Iar rezultatul său depinde de această valoare.

Să demonstreze:

Aici am folosit sune așa cum este descris în capitolul Decoratori și transmiterea, suna/se aplică pentru a executa funcția objectToString în contextul this=arr.

intern, algoritmul toString examinează this și returnează rezultatul corespunzător. Mai multe exemple:

simbol.,toStringTag

comportamentul de Obiect toString poate fi personalizat folosind un obiect special de proprietate Symbol.toStringTag.de exemplu:

let user = { : "User"};alert( {}.toString.call(user) ); // 

pentru majoritatea obiectelor specifice mediului, există o astfel de proprietate. Aici sunt unele browser exemple specifice:

după Cum puteți vedea, rezultatul este exact Symbol.toStringTag (dacă există), înfășurat în .,la final avem „typeof on steroids” care funcționează nu numai pentru tipuri de date primitive, ci și pentru obiecte încorporate și chiar poate fi personalizat.

putem folosi {}.toString.callîn loc de instanceof pentru obiecte încorporate atunci când dorim să obținem Tipul ca șir, mai degrabă decât doar pentru a verifica.,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.,

și instanceof operatorul strălucește cu adevărat atunci când lucrăm cu o ierarhie de clasă și doriți să verificați clasa ținând cont de moștenire.