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 truealsobjbehoort tot deClassof 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″>

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.,

en instanceof operator schijnt echt als we werken met een klasse hiërarchie en willen controleren op de klasse rekening houdend met overerving.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *