a instanceof operátor lehetővé teszi annak ellenőrzését, hogy egy objektum egy adott osztályhoz tartozik-e. Az örökséget is figyelembe veszi.

ilyen ellenőrzésre sok esetben szükség lehet. Például polimorf függvény építésére használható, amely az érveket típusától függően eltérő módon kezeli.,

A instanceof operátor

A szintaxis:

obj instanceof Class

vissza true ha obj tartozik, hogy a Class vagy egy osztály örökli tőle.,

például:

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

Ez is működik, a kivitelező funkciók:

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

…S, beépített osztályok, mint a Array:

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

Kérjük, vegye figyelembe, hogy a arr is tartozik, hogy a Object osztály., Ez azért van, mert Arrayprototípusosan örökli Object.

általában instanceof vizsgálja a prototípus lánc az ellenőrzés. Egyéni logikát is beállíthatunk a Symbol.hasInstancestatikus metódusban.,

a obj instanceof Class algoritmusa nagyjából a következőképpen működik:

itt látható a rabbit instanceof Animal összehasonlítja a Animal.prototype:

div id=”307b3dec00″>

egyébként van egy módszer is obja.isprotototypeof (objB), amely true if objA valahol a objBprototípusláncában található., Tehát a obj instanceof Class teszt újrafogalmazható, mint Class.prototype.isPrototypeOf(obj).

Ez vicces, de aClass konstruktor maga nem vesz részt a csekken! Csak a prototípusok láncolata és aClass.prototype számít.

Ez érdekes következményekhez vezethet, ha aprototype tulajdonság megváltozik az objektum létrehozása után.

mint itt:

Bonus: Object.prototípus.,toString a típus

már tudjuk, hogy egyszerű tárgyak kerülnek átalakításra, hogy a húr, mint a :

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

Ez a végrehajtása toString. De van egy rejtett funkció, ami a toString valójában sokkal erősebb, mint ez. A kiterjesztett typeof és a instanceofalternatívájaként is használhatjuk.

furcsán hangzik? Valóban. Demisztifikáljuk.,

specifikáció szerint a beépített toString kivonható az objektumból, és bármely más érték összefüggésében végrehajtható. Az eredmény pedig attól az értéktől függ.

demonstráljuk:

itt a Decorators and forwarding fejezetben leírtak szerint hívtuk a objectToString a this=arrkontextusban.

belsőleg a toString algoritmus vizsgálja this és visszaadja a megfelelő eredményt. További példák:

szimbólum.,toStringTag

az objektum viselkedése toString testreszabható egy speciális objektum tulajdonsággal Symbol.toStringTag.

például:

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

A legtöbb környezet-specifikus tárgyak, van egy ilyen ingatlan. Íme néhány böngésző specifikus példa:

amint láthatja, az eredmény pontosan Symbol.toStringTag (ha létezik), .,

a végén van “typeof a szteroidok”, hogy nem csak akkor működik, primitív adattípusok, hanem a beépített objektumok, sőt testre szabható.

tudjuk használni {}.toString.call helyett instanceof A beépített objektumok, ha azt akarjuk, hogy a típus, mint egy string helyett csak ellenőrizni.,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.,

és instanceof az operátor valóban ragyog, amikor egy osztályhierarchiával dolgozunk, és szeretnénk ellenőrizni az osztályt, figyelembe véve az örökséget.