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″>

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

A instanceof operátor opravdu svítí, když pracujeme s třídou hierarchie a pro třídy s přihlédnutím dědictví.