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″>
typeof{}.toStringSymbol.toStringTag instanceofAs 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.
















Vélemény, hozzászólás?