I visualiseringen nedenfor,
Det er to matriseobjekter (cars
& bikes
) som er opprettet med syntaksen nedenfor,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
hvis [[Class]]
eiendomsverdien er Array
.
I tillegg har vi også Array.prototype
, som er fullt funksjonell matrise, som vist nedenfor,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
Generelt, når du setter noe på prototype
, deler hver forekomst av objektet samme egenskaper.
Spørsmål:
Med length
eiendom som medlem, Hva er ideen bak Array.prototype
å være fullt funksjonell matrise?
Kommentarer
Svar
Array-prototypen er i seg selv et fullt funksjonelt array, fordi det må inneholde all funksjonaliteten som er nødvendig for at et objekt skal fungere som en array. Array-instansene arver all sin funksjonalitet gjennom prototypen.
I følge spesifikasjonen :
Array-prototypeobjektet er i seg selv en matrise; dens [[Class]] er «Array», og den har en lengdeegenskap (hvis opprinnelige verdi er +0) og den spesielle [[DefineOwnProperty]] interne metoden beskrevet i 15.4.5.1.
Kommentarer
- Men
length
egenskap er instansnivåegenskap. Hver matriseinstans har sin egenlength
verdi. Hvorfor vil du plassere egenskapenlength
iArray.prototype
? Det ville være fornuftig å plasserelength
eiendom iArray
konstruktorfunksjon, ved øyeblikkelig øyeblikkelig vil hver forekomst ha sin egenlength
-egenskap som betyr arraylengde. Menlength
egenskapen tilArray
konstruktorfunksjon angir antall argumenter som forventes av konstruktorfunksjon - @overexchange: Objects does ikke arve egenskaper fra konstruktøren, bare fra prototypen. Derfor har Array.length ikke noe forhold til Array.prototype.length.
- @JacquesB Dette betyr at
length
er en delt egenskap mellom alle matriseinstanser og som så snart en forekomst endrer sin egenlength
-egenskap, blir den deltelength
skyggelagt og derfor ubrukelig (fordi en aritmetisk operasjon resulterer i en skyggelegging forekommer, f.eks.x.length++
er faktiskx.length = x.length + 1
). Så er den eneste bruken av den egenskapen, ifølge deg, slik at alle matriseinstanser får en innledendelength
-egenskap? - Hvert matriseobjekt har en
length
egenskap som på ingen måte er avledet fraArray.prototype.length
.Bare prøv å setteArray.prototype[10] = 42
, som gjør atArray.prototype.length
er lik 11, men selvfølgelig tar ikke nyopprettede matriser dette opp. De arver elementet – prøv[][10]
. Knapt en ønskelig oppførsel. Uansett hva som kan være årsaken til at Array.prototype er en matrise, harlength
ingenting å gjøre med det. - Hvorfor kan ' t det være et vanlig objekt med alle egenskapene som push etc implementert, slik at Array Instance arver fra det?
array
ikke fullt funksjonell? " Og jeg tror svaret på det er selvsagt: av de samme grunnene at du deler funksjonaliteten til en klasse i en abstrakt klasse og en klasse som arver fra det.Array.prototype
er mer ennObject
? Mer i betydningen å tilby muligheter for å lagre elementer.[42]
er egentlig det samme som{ "0": 42 }
men med en annen prototype og den funkylength
eiendom.length
-egenskap som økes for hver eiendom som er lagret i objektet. Det er her jeg sier atArray.prototype
er fullt funksjonell matrise.