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
lengthegenskap er instansnivåegenskap. Hver matriseinstans har sin egenlengthverdi. Hvorfor vil du plassere egenskapenlengthiArray.prototype? Det ville være fornuftig å plasserelengtheiendom iArraykonstruktorfunksjon, ved øyeblikkelig øyeblikkelig vil hver forekomst ha sin egenlength-egenskap som betyr arraylengde. Menlengthegenskapen tilArraykonstruktorfunksjon 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
lengther en delt egenskap mellom alle matriseinstanser og som så snart en forekomst endrer sin egenlength-egenskap, blir den deltelengthskyggelagt 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
lengthegenskap som på ingen måte er avledet fraArray.prototype.length.Bare prøv å setteArray.prototype[10] = 42, som gjør atArray.prototype.lengther 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, harlengthingenting å 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?
arrayikke 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.prototypeer 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 funkylengtheiendom.length-egenskap som økes for hver eiendom som er lagret i objektet. Det er her jeg sier atArray.prototypeer fullt funksjonell matrise.