In de onderstaande visualisatie,
Er zijn twee array-objecten (cars & bikes) die zijn gemaakt met onderstaande syntaxis,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
waarvan [[Class]] eigenschapswaarde is Array.
Daarnaast hebben we ook Array.prototype, wat een volledig functionele array is, zoals hieronder weergegeven,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
In het algemeen, wanneer u iets op de prototype plaatst, deelt elke instantie van het object de dezelfde eigenschappen.
Vraag:
Met length eigenschap als lid, wat is het idee achter Array.prototype een volledig functionele array zijn?
Reacties
Answer
Het Array-prototype is zelf een volledig functionele array, omdat het alle functionaliteit moet bevatten die nodig is om een object als array te laten functioneren. De Array-instances erven al hun functionaliteit via het prototype.
Volgens de specificatie :
Het prototype-object Array is zelf een array; zijn [[Class]] is “Array”, en het heeft een eigenschap length (waarvan de initiële waarde +0 is) en de speciale [[DefineOwnProperty]] interne methode beschreven in 15.4.5.1.
Reacties
- Maar
lengtheigenschap is instantieniveau. Elke array-instantie heeft zijn eigenlength-waarde. Waarom zou u de eigenschaplengthinArray.prototypeplaatsen? Het zou logisch zijn om de eigenschaplengthin deArrayconstructorfunctie te plaatsen, bij instantiatie heeft elke instantie zijn eigenlengtheigenschap die de array-lengte aangeeft. Maarlengtheigenschap vanArrayconstructorfunctie geeft het aantal argumenten aan dat verwacht wordt door constructorfunctie - @overexchange: Objects doet erven geen eigenschappen van de constructor, alleen van het prototype. Daarom heeft de Array.length geen relatie met de Array.prototype.length.
- @JacquesB Dit betekent dat
lengtheen gedeelde eigenschap is tussen alle array-instanties en zoals zodra een instantie zijn eigenlengtheigenschap wijzigt, wordt die gedeeldelengthoverschaduwd en daardoor onbruikbaar (omdat elke rekenkundige bewerking resulteert in voorkomen, bijvoorbeeldx.length++is eigenlijkx.length = x.length + 1). Dus, is het enige gebruik van die eigenschap volgens jou, zodat alle array-instanties een initiëlelength-eigenschap krijgen? - Elk array-object heeft een
lengtheigenschap die op geen enkele manier is afgeleid vanArray.prototype.length.Probeer gewoonArray.prototype[10] = 42in te stellen, waardoorArray.prototype.lengthgelijk is aan 11, maar natuurlijk nemen nieuw gemaakte arrays dit niet op. Ze nemen het element over – probeer[][10]. Nauwelijks wenselijk gedrag. Wat de reden ook mag zijn waarom Array.prototype een array is,lengthheeft er niets mee te maken. - Waarom kan ' Is het een gewoon object met alle eigenschappen zoals push etc geïmplementeerd, zodat Array Instance er van erven?
arrayniet volledig functioneel? " En ik denk dat het antwoord daarop vanzelfsprekend is: om dezelfde redenen dat je de functionaliteit van een klasse opsplitst in een abstracte klasse en een klasse die erft van het.Array.prototypemeer danObject? Meer in de zin van het bieden van een mogelijkheid om elementen op te slaan.[42]is in wezen hetzelfde als{ "0": 42 }maar met een ander prototype en dat funkylengtheigenschap.lengthdie worden opgehoogd voor elke eigenschap die in het object is opgeslagen. Dit is waar ik zeg datArray.prototypeeen volledig functionele array is.