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é
lengthest une propriété au niveau de linstance. Chaque instance de tableau a sa propre valeurlength. Pourquoi placer la propriétélengthdansArray.prototype? Il serait judicieux de placer la propriétélengthdans la fonction constructeurArray, lors de linstanciation, chaque instance aura son proprelengthqui signifie la longueur du tableau. Mais lalengthpropriété de la fonction constructeurArraysignifie 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
lengthest 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éelengthdevient 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
lengthproprié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,lengthna 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?
arraynest 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.prototypeest 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 funkylengthpropriété.lengthincrémentée pour chaque propriété stockée dans lobjet. Cest là que je dis queArray.prototypeest un tableau entièrement fonctionnel.