Dans la visualisation ci-dessous,
Il y a deux objets de tableau (cars
& bikes
) qui sont créés avec la syntaxe ci-dessous,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
dont [[Class]]
la valeur de la propriété est Array
.
De plus, nous avons également Array.prototype
, qui est un tableau entièrement fonctionnel, comme ci-dessous,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
Généralement, lorsque vous placez quelque chose sur le prototype
, chaque instance de lobjet partage le mêmes propriétés.
Question:
Avec la propriété length
en tant que membre, quelle est lidée derrière Array.prototype
étant un tableau entièrement fonctionnel?
Commentaires
Answer
Le prototype Array est lui-même un tableau entièrement fonctionnel, car il doit contenir toutes les fonctionnalités nécessaires pour quun objet fonctionne comme un tableau. Les instances Array héritent de toutes leurs fonctionnalités via le prototype.
Selon la spécification :
Lobjet prototype Array est lui-même un tableau; sa [[Class]] est « Array », et il a une propriété de longueur (dont la valeur initiale est +0) et la méthode interne spéciale [[DefineOwnProperty]] décrite au 15.4.5.1.
Commentaires
- Mais la propriété
length
est une propriété au niveau de linstance. Chaque instance de tableau a sa propre valeurlength
. Pourquoi placer la propriétélength
dansArray.prototype
? Il serait judicieux de placer la propriétélength
dans la fonction constructeurArray
, lors de linstanciation, chaque instance aura son proprelength
qui signifie la longueur du tableau. Mais lalength
propriété de la fonction constructeurArray
signifie le nombre darguments attendus par la fonction constructeur - @overexchange: Objects does pas hériter des propriétés du constructeur, uniquement du prototype. Par conséquent, le Array.length na pas de relation avec le Array.prototype.length.
- @JacquesB Cela signifie que
length
est une propriété partagée entre toutes les instances de tableau et comme dès quune instance modifie sa propre propriétélength
, celle partagéelength
devient ombrée, et donc inutile (car toute opération arithmétique entraîne un ombrage se produisant, par exemplex.length++
est en faitx.length = x.length + 1
). Donc, est-ce que la seule utilisation de cette propriété, selon vous, est-elle pour que toutes les instances de tableau obtiennent une propriété initialelength
? - Chaque objet de tableau a un
length
propriété qui nest en aucun cas dérivée deArray.prototype.length
.Essayez simplement de définirArray.prototype[10] = 42
, ce qui rendArray.prototype.length
égal à 11, mais bien sûr, les tableaux nouvellement créés ne le prennent pas. Ils héritent de lélément – essayez[][10]
. Ce nest guère un comportement souhaitable. Quelle que soit la raison pour laquelle Array.prototype est un tableau,length
na rien à voir avec cela. - Pourquoi ' Est-ce que ce sera un objet ordinaire avec toutes les propriétés telles que push, etc. implémentées, de sorte que Array Instance en hérite?
array
nest pas entièrement fonctionnel? " Et je pense que la réponse est évidente: pour les mêmes raisons que vous divisez la fonctionnalité dune classe en une classe abstraite et une classe qui hérite deArray.prototype
est supérieur àObject
? Plus dans le sens de la possibilité de stocker des éléments.[42]
est essentiellement la même chose que{ "0": 42 }
mais avec un prototype différent et ce funkylength
propriété.length
incrémentée pour chaque propriété stockée dans lobjet. Cest là que je dis queArray.prototype
est un tableau entièrement fonctionnel.