Varför är Array.prototype utformad för att vara en fullt fungerande matris?

I nedanstående visualisering

ange bildbeskrivning här

Det finns två matrisobjekt (cars & bikes) som skapas med syntax nedan,

var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"]; 

vars [[Class]] egenskapsvärde är Array.

Dessutom har vi också Array.prototype, som är en fullt fungerande matris, som visas nedan,

> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2 

Generellt, när du lägger något på prototype, delar varje förekomst av objektet samma egenskaper.

Fråga:

Med length egenskap som medlem, Vad är tanken bakom Array.prototype vara fullt fungerande array?

Kommentarer

  • Min uppfattning är att < objekt > .pr ototyp är alltid ett objekt, för hela prototypens poäng är att det ' är en karta från metodnamn till faktiska metoder som delas av flera olika objekt. Det faktum att Array.prototype också är en matris är relaterat till det faktum att alla matriser är speciella objekt. Frågar du varför Array.prototype är en matris och inte ett vanligt objekt? Eller varför JS-prototyper inte är begränsade till att vara sträng – > funktionskartor? Eller varför JS-matriser är speciella objekt? Eller något annat?
  • Du ' ställer förmodligen fel fråga. Den rätta frågan är " varför är inte ' t array inte fullt fungerande? " Och jag tror att svaret på det är självklart: av samma skäl som att du delar funktionerna i en klass i en abstrakt klass och en klass som ärver från det.
  • @Ixrec Varför Array.prototype är mer än Object? Mer i betydelsen att tillhandahålla möjlighet att lagra element.
  • @overexchange Men objekt lagrar också element. Om du menar att lagra element med heltalstangenter gör matriser inte ' t heller, eftersom matriser är objekt. Heltalstangenterna omvandlas alltid till strängar (för Javascript är lite konstigt). [42] är i princip samma sak som { "0": 42 } men med en annan prototyp och den funky length egendom.
  • @Ixrec Men inte alla objekt har length egenskap som ökas för varje egendom som lagras i objektet. Det är här jag säger att Array.prototype är en fullt fungerande array.

Svar

Array-prototypen är i sig en helt funktionell array, eftersom den måste innehålla alla funktioner som är nödvändiga för att ett objekt ska fungera som en array. Array-instanserna ärver all sin funktionalitet genom prototypen.

Enligt spec :

Array-prototypobjektet är i sig en matris; dess [[klass]] är ”Array” och den har en längdegenskap (vars ursprungliga värde är +0) och den speciella [[DefineOwnProperty]] interna metoden som beskrivs i 15.4.5.1.

Kommentarer

  • Men length egenskap är instansnivåegenskap. Varje matrisinstans har sitt eget length -värde. Varför skulle du placera length egenskapen i Array.prototype? Det vore vettigt att placera length egenskap i Array konstruktörfunktion, vid instantiering kommer varje instans att ha sin egen length egenskap som anger arraylängd. Men length egenskap för Array konstruktorfunktion betyder antalet argument som förväntas av konstruktorfunktion
  • @overexchange: Objekt gör inte ärva egenskaper från konstruktören, bara från prototypen. Därför har Array.length ingen relation till Array.prototype.length.
  • @JacquesB Detta betyder att length är en delad egenskap mellan alla arrayinstanser och som så snart en instans ändrar sin egen length egendom, blir den delade length skuggad och därför oanvändbar (eftersom all aritmetisk operation resulterar i en skuggning förekommer, t.ex. x.length++ är faktiskt x.length = x.length + 1). Så, är den enda användningen av den egenskapen, enligt dig, så att alla matrisinstanser får en initial length -egenskap?
  • Varje arrayobjekt har en length egenskap som inte på något sätt härrör från Array.prototype.length.Försök bara ställa in Array.prototype[10] = 42, vilket gör att Array.prototype.length är lika med 11, men naturligtvis tar nyskapade matriser inte upp detta. De ärver elementet – försök [][10]. Knappast ett önskvärt beteende. Oavsett vad som kan vara anledningen till att Array.prototype är en array, length har inget att göra med det.
  • Varför kan ' t det vara ett vanligt objekt med alla egenskaper som push etc implementerat, så att Array Instance ärver från det?

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *