operátorinstanceof
umožňuje zkontrolovat, zda objekt patří do určité třídy. Zohledňuje také dědictví.
taková kontrola může být v mnoha případech nezbytná. Může být například použit pro budování polymorfní funkce, která zachází s argumenty odlišně v závislosti na jejich typu.,
instanceof operátor
syntaxe je:
obj instanceof Class
vrací true
obj
patří do Class
nebo třída dědí z něj.,
například:
class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true
funguje To i s konstruktor funkce:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
…A s vestavěným-in třídy jako Array
:
let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true
vezměte Prosím na vědomí, že arr
patří do Object
třídy., Je to proto, že Array
prototypicky dědí z Object
.
normálněinstanceof
zkoumá řetězec prototypu pro kontrolu. Můžeme také nastavit vlastní logiku ve statické metodě Symbol.hasInstance
.,
algoritmus obj instanceof Class
funguje zhruba takto:
Tady je obrázek toho, co rabbit instanceof Animal
porovnává s Animal.prototype
:
mimochodem, tam je také způsob, objA.isPrototypeOf(objB), která vrací true
objA
je někde v řetězci prototypy objB
., Takže test obj instanceof Class
lze přeformulovat jako Class.prototype.isPrototypeOf(obj)
.
je to legrační ,aleClass
Konstruktor sám se na kontrole neúčastní! Záleží pouze na řetězci prototypů a Class.prototype
.
, které mohou vést k zajímavým důsledkům, když se po vytvoření objektu změní vlastnost prototype
.
jako zde:
Bonus: objekt.prototyp.,toString pro typ
již víme, že prosté objekty jsou převedeny na řetězec jako :
let obj = {};alert(obj); // alert(obj.toString()); // the same
to je jejich implementace toString
. Ale je tu skrytá funkce, která dělá toString
ve skutečnosti mnohem silnější než to. Můžeme jej použít jako rozšířenou typeof
a alternativu pro instanceof
.
Zní to divně? Skutečně. Pojďme demystifikovat.,
podle specifikace lze vestavěný toString
extrahovat z objektu a provést v kontextu jakékoli jiné hodnoty. A jeho výsledek závisí na této hodnotě.
Pojďme si ukázat,
Zde jsme použili volání, jak je popsáno v kapitole Dekoratéry a přesměrování volání/použít k provedení funkce objectToString
v rámci this=arr
.
interně algoritmustoString
zkoumá this
a vrátí odpovídající výsledek. Další příklady:
Symbol.,toStringTag
chování Objektu toString
může být upravena pomocí speciální vlastnost objektu Symbol.toStringTag
.
například:
let user = { : "User"};alert( {}.toString.call(user) ); //
Pro většinu prostředí-konkrétní objekty, tam je takový majetek. Zde jsou některé prohlížeče konkrétní příklady:
Jak můžete vidět, výsledek je přesně to, Symbol.toStringTag
(pokud existuje), zabalené do .,
na konci máme „typeof na steroidech“, který funguje nejen pro primitivní datové typy, ale také pro vestavěné objekty a dokonce je lze přizpůsobit.
můžeme použít {}.toString.call
místo instanceof
pro vestavěné objekty, když chceme získat typ jako řetězec, spíše než jen se podívejte.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
As we can see, {}.toString
is technically a „more advanced” typeof
.,
A instanceof
operátor opravdu svítí, když pracujeme s třídou hierarchie a pro třídy s přihlédnutím dědictví.
Napsat komentář