Waarom is Array.prototype ontworpen als een volledig functionele array?

In de onderstaande visualisatie,

voer hier een afbeeldingbeschrijving in

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

  • Ik heb begrepen dat < object > .pr ototype is altijd een object, omdat het hele punt van een prototype is dat het ' een kaart is van methodenamen naar werkelijke methoden die worden gedeeld door verschillende objecten. Dat Array.prototype ook een array is, heeft te maken met het feit dat alle arrays speciale objecten zijn. Vraag je waarom Array.prototype een array is en geen gewoon object? Of waarom zijn JS-prototypes niet beperkt tot string – > functiekaarten? Of waarom JS-arrays speciale objecten zijn? Of iets anders?
  • Je ' stelt waarschijnlijk de verkeerde vraag. De juiste vraag is " waarom is niet ' t 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.
  • @Ixrec Waarom is Array.prototype meer dan Object? Meer in de zin van het bieden van een mogelijkheid om elementen op te slaan.
  • @overexchange Maar objecten slaan ook elementen op. Als je bedoelt dat je elementen opslaat met geheeltallige sleutels, doen arrays dat ook niet ', omdat arrays objecten zijn. De integer-sleutels worden altijd omgezet in strings (omdat Javascript een beetje raar is). [42] is in wezen hetzelfde als { "0": 42 } maar met een ander prototype en dat funky length eigenschap.
  • @Ixrec Maar niet alle objecten hebben de eigenschap length die worden opgehoogd voor elke eigenschap die in het object is opgeslagen. Dit is waar ik zeg dat Array.prototype een volledig functionele array is.

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 eigen length -waarde. Waarom zou u de eigenschap length in Array.prototype plaatsen? Het zou logisch zijn om de eigenschap length in de Array constructorfunctie te plaatsen, bij instantiatie heeft elke instantie zijn eigen length eigenschap die de array-lengte aangeeft. Maar length eigenschap van Array 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 eigen length eigenschap wijzigt, wordt die gedeelde length overschaduwd en daardoor onbruikbaar (omdat elke rekenkundige bewerking resulteert in voorkomen, bijvoorbeeld x.length++ is eigenlijk x.length = x.length + 1). Dus, is het enige gebruik van die eigenschap volgens jou, zodat alle array-instanties een initiële length -eigenschap krijgen?
  • Elk array-object heeft een length eigenschap die op geen enkele manier is afgeleid van Array.prototype.length.Probeer gewoon Array.prototype[10] = 42 in te stellen, waardoor Array.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?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *