deinstanceof
operator staat toe om te controleren of een object tot een bepaalde klasse behoort. Het houdt ook rekening met erfenis.
een dergelijke controle kan in veel gevallen noodzakelijk zijn. Bijvoorbeeld, het kan worden gebruikt voor het bouwen van een polymorfe functie, degene die argumenten verschillend behandelt afhankelijk van hun type.,
het instanceof operator
de syntaxis is:
obj instanceof Class
het geeft true
alsobj
behoort tot deClass
of een klasse die ervan overerft.,
bijvoorbeeld:
class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true
Het werkt ook met constructor-functies:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
…En met ingebouwde klassen zoals Array
:
let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true
merk op dat arr
behoort ook tot de klasse Object
., Dat komt omdat Array
prototypisch erft van Object
.
normaliter onderzoekt instanceof
de prototypeketen voor de controle. We kunnen ook een aangepaste logica instellen in de statische methode Symbol.hasInstance
.,
Het algoritme van obj instanceof Class
werkt ongeveer als volgt:
Hier is de illustratie van wat rabbit instanceof Animal
vergelijkt met Animal.prototype
:
Door de manier, is er ook een methode objA.isPrototypeOf (objB), dat true
geeft als objA
ergens in de keten van prototypes zit voor objB
., De test van obj instanceof Class
kan dus worden geherformuleerd als Class.prototype.isPrototypeOf(obj)
.
Het is grappig, maar deClass
constructor zelf neemt niet deel aan de controle! Alleen de keten van prototypes en Class.prototype
is van belang.
dat kan interessante gevolgen hebben als een prototype
eigenschap wordt gewijzigd nadat het object is gemaakt.
zoals hier:
Bonus: Object.prototype.,toString voor het type
we weten al dat platte objecten worden geconverteerd naar tekenreeks als :
let obj = {};alert(obj); // alert(obj.toString()); // the same
dat is hun implementatie van toString
. Maar er is een verborgen functie die toString
eigenlijk veel krachtiger maakt dan dat. We kunnen het gebruiken als een extended typeof
en een alternatief voor instanceof
.
klinkt vreemd? Inderdaad. Laten we demystificeren.,
volgens specificatie kan de ingebouwde toString
uit het object worden geëxtraheerd en in de context van elke andere waarde worden uitgevoerd. En het resultaat hangt af van die waarde.
laten we demonstreren:
hier gebruikten we call zoals beschreven in het hoofdstuk Decorators en forwarding, call/apply om de functie objectToString
uit te voeren in de context this=arr
.
intern onderzoekt hettoString
algoritme this
en geeft het overeenkomstige resultaat terug. Meer voorbeelden:
symbool.,toStringTag
het gedrag van Object toString
kan worden aangepast met behulp van een speciale objecteigenschap Symbol.toStringTag
.
bijvoorbeeld:
let user = { : "User"};alert( {}.toString.call(user) ); //
voor de meeste omgevingspecifieke objecten is er een dergelijke eigenschap. Hier zijn enkele browserspecifieke voorbeelden:
zoals u kunt zien, is het resultaat precies Symbol.toStringTag
(indien aanwezig), verpakt in .,
aan het eind hebben we “type of on steroids” dat niet alleen werkt voor primitieve gegevenstypen, maar ook voor ingebouwde objecten en zelfs kan worden aangepast.
we kunnen {}.toString.call
gebruiken in plaats van instanceof
voor ingebouwde objecten wanneer we het type als een tekenreeks willen krijgen in plaats van alleen om te controleren.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
As we can see, {}.toString
is technically a “more advanced” typeof
.,
en instanceof
operator schijnt echt als we werken met een klasse hiërarchie en willen controleren op de klasse rekening houdend met overerving.
© 2021 Tombouctou
Thema gemaakt door Anders Noren — Boven ↑
Geef een reactie