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 Array
prototí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.hasInstance
statikus 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 objB
prototí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 instanceof
alternatí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=arr
kontextusban.
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
{}.toString
Symbol.toStringTag
instanceof
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.
Vélemény, hozzászólás?