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 Class
poate 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″>
typeof
{}.toString
Symbol.toStringTag
instanceof
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.
Lasă un răspuns