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
length
eigenschap is instantieniveau. Elke array-instantie heeft zijn eigenlength
-waarde. Waarom zou u de eigenschaplength
inArray.prototype
plaatsen? Het zou logisch zijn om de eigenschaplength
in deArray
constructorfunctie te plaatsen, bij instantiatie heeft elke instantie zijn eigenlength
eigenschap die de array-lengte aangeeft. Maarlength
eigenschap vanArray
constructorfunctie 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
length
een gedeelde eigenschap is tussen alle array-instanties en zoals zodra een instantie zijn eigenlength
eigenschap wijzigt, wordt die gedeeldelength
overschaduwd 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
length
eigenschap die op geen enkele manier is afgeleid vanArray.prototype.length
.Probeer gewoonArray.prototype[10] = 42
in te stellen, waardoorArray.prototype.length
gelijk 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,length
heeft 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?
array
niet 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.prototype
meer 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 funkylength
eigenschap.length
die worden opgehoogd voor elke eigenschap die in het object is opgeslagen. Dit is waar ik zeg datArray.prototype
een volledig functionele array is.