instanceof – operaattorin avulla voidaan tarkistaa, onko esine kuuluu tiettyyn luokkaan. Siinä otetaan myös perintö huomioon.

tällainen tarkistus voi olla tarpeen monissa tapauksissa. Sitä voidaan käyttää esimerkiksi polymorfisen funktion rakentamiseen, joka käsittelee argumentteja eri tavalla niiden tyypistä riippuen.,

N instanceof operaattori

syntaksi on:

obj instanceof Class

palaa true jos obj kuuluu Class tai luokan perivät sen.,

esimerkiksi:

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

Se toimii myös rakentaja toiminnot:

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

…Ja sisäänrakennettu luokkiin, kuten Array:

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

huomaa, että arr kuuluu Object luokka., Se on, koska Array prototypically perii Object.

Normaalisti instanceof tutkii prototyyppi ketju tarkistaa. Voimme myös asettaa mukautetun logiikan staattiseen menetelmään Symbol.hasInstance.,

algoritmi obj instanceof Class toimii suunnilleen seuraavasti:

Tässä on esimerkki siitä, mitä rabbit instanceof Animal vertaa Animal.prototype:

muuten, siellä on myös menetelmä, objA.isPrototypeOf(objB), joka palauttaa true jos objA on jossain ketjussa prototyyppejä objB., Joten testi obj instanceof Class voidaan muotoilla uudelleen seuraavasti Class.prototype.isPrototypeOf(obj).

Se on hauska, mutta Class rakentaja itse ei osallistu tarkista! Vain prototyyppien ketjulla ja Class.prototype on merkitystä.

se voi johtaa mielenkiintoisiin seurauksiin, kun prototype ominaisuus muuttuu kohteen luomisen jälkeen.

Like here:

Bonus: Object.prototyyppi.,toString tyyppi

– tiedämme jo, että pelkkä objektit muunnetaan merkkijono kuten :

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

Se on niiden täytäntöönpano toString. Mutta on olemassa piilevä ominaisuus, joka tekee toString todella paljon voimakkaammaksi. Voimme käyttää sitä laajennettuna typeof ja vaihtoehtona instanceof.

kuulostaa oudolta? Todellakin. Demystifioidaan.,

Kaikki erittely, sisäänrakennettu toString voidaan poimia esineen ja teloitettiin yhteydessä jokin muu arvo. Ja sen tulos riippuu siitä arvosta.

katsotaanpa osoittaa:

Tässä käytimme soittaa, kuten on kuvattu luvussa Sisustussuunnittelijan ja huolinta, soita/sovelleta suorittaa toiminnon objectToString yhteydessä this=arr.

Sisäisesti toString algoritmi tutkii this ja palauttaa vastaavan tuloksen. Lisää esimerkkejä:

symboli.,toStringTag

käyttäytyminen Esine toString voidaan räätälöidä käyttämällä erityistä objektin ominaisuus Symbol.toStringTag.

esimerkiksi:

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

useimmille ympäristö-erityisiä esineitä, siellä on tällainen ominaisuus. Tässä on joitakin selaimen konkreettisia esimerkkejä:

Kuten näette, tulos on täsmälleen Symbol.toStringTag (jos olemassa), kääritty .,

lopussa meillä on ”typeof steroideja”, joka ei vain toimii primitiivityyppejä, mutta myös sisäänrakennettu esineitä ja jopa voidaan räätälöidä.

voidaan käyttää {}.toString.call sijaan instanceof sisäänrakennettu esineitä, kun haluamme saada tyyppi merkkijonona eikä vain tarkistaa.,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.,

Ja instanceof operaattori todella loistaa kun teemme luokan hierarkian ja haluat tarkistaa luokan ottaen huomioon perintö.