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″>
typeof
{}.toString
Symbol.toStringTag
instanceof
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ö.
Vastaa