Pourquoi Array.prototype est-il conçu pour être un tableau entièrement fonctionnel?

Dans la visualisation ci-dessous,

entrez la description de limage ici

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

  • Je crois comprendre que < objet > .pr Lototype est toujours un objet, car tout lintérêt dun prototype est quil ' est une carte des noms de méthodes aux méthodes réelles partagées par plusieurs objets différents. Le fait que Array.prototype soit également un tableau est lié au fait que tous les tableaux sont des objets spéciaux. Vous vous demandez pourquoi Array.prototype est un tableau et non un objet régulier? Ou pourquoi les prototypes JS ne se limitent pas à être des chaînes de caractères – > des cartes de fonctions? Ou pourquoi les tableaux JS sont-ils des objets spéciaux? Ou autre chose?
  • Vous ' posez probablement la mauvaise question. La bonne question est " pourquoi n ' t 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 de
  • @Ixrec Pourquoi Array.prototype est supérieur à Object? Plus dans le sens de la possibilité de stocker des éléments.
  • @overexchange Mais les objets stockent aussi des éléments. Si vous voulez stocker des éléments avec des clés entières, les tableaux ne le font pas non plus, car les tableaux sont des objets. Les clés entières sont toujours converties en chaînes (car Javascript est un peu bizarre). [42] est essentiellement la même chose que { "0": 42 } mais avec un prototype différent et ce funky length propriété.
  • @Ixrec Mais tous les objets nont pas de propriété length incrémentée pour chaque propriété stockée dans lobjet. Cest là que je dis que Array.prototype est un tableau entièrement fonctionnel.

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 valeur length. Pourquoi placer la propriété length dans Array.prototype? Il serait judicieux de placer la propriété length dans la fonction constructeur Array, lors de linstanciation, chaque instance aura son propre length qui signifie la longueur du tableau. Mais la length propriété de la fonction constructeur Array 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ée length devient ombrée, et donc inutile (car toute opération arithmétique entraîne un ombrage se produisant, par exemple x.length++ est en fait x.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é initiale length?
  • Chaque objet de tableau a un length propriété qui nest en aucun cas dérivée de Array.prototype.length.Essayez simplement de définir Array.prototype[10] = 42, ce qui rend Array.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?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *