I nedenstående visualisering
Der er to array-objekter (cars
& bikes
), der er oprettet med nedenstående syntaks,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
hvis [[Class]]
egenskabsværdi er Array
.
Derudover har vi også Array.prototype
, som er et fuldt funktionelt array, 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 lægger noget på prototype
, deler hver forekomst af objektet samme egenskaber.
Spørgsmål:
Med length
ejendom som medlem, Hvad er ideen bag Array.prototype
er fuldt funktionel matrix?
Kommentarer
Svar
Array-prototypen er i sig selv et fuldt funktionelt array, fordi det skal indeholde al den funktionalitet, der er nødvendig for, at et objekt kan fungere som et array. Array-instanserne arver al deres funktionalitet gennem prototypen.
Ifølge spec :
Array-prototype-objektet er i sig selv et array; dens [[klasse]] er “Array”, og den har en længdeegenskab (hvis startværdi er +0) og den specielle [[DefineOwnProperty]] interne metode beskrevet i 15.4.5.1.
Kommentarer
- Men
length
egenskaben er instansniveauegenskab. Hver matrixinstans har sin egenlength
værdi. Hvorfor placerer du egenskabenlength
iArray.prototype
? Det ville være fornuftigt at placerelength
ejendom iArray
konstruktorfunktion, efter instantiering vil hver instans have sin egenlength
egenskab, der betyder array længde. Menlength
egenskab forArray
konstruktorfunktion angiver antallet af argumenter, der forventes af konstruktorfunktion - @overexchange: Objects does ikke arve egenskaber fra konstruktøren, kun fra prototypen. Derfor har Array.length ikke nogen relation til Array.prototype.length.
- @JacquesB Dette betyder, at
length
er en delt egenskab mellem alle array-forekomster og som snart en instans ændrer sin egenlength
egenskab, bliver den deltelength
skygget og derfor ubrugelig (fordi enhver aritmetisk operation resulterer i en skygge forekommer, f.eks.x.length++
er faktiskx.length = x.length + 1
). Så er den eneste anvendelse af denne egenskab ifølge dig, så alle matrixinstanser får en indledendelength
egenskab? - Hvert array-objekt har en
length
egenskab, der på ingen måde er afledt afArray.prototype.length
.Prøv bare at indstilleArray.prototype[10] = 42
, hvilket gørArray.prototype.length
lig med 11, men naturligvis opfanger nyoprettede arrays ikke dette. De arver elementet – prøv[][10]
. Næppe en ønskelig opførsel. Uanset hvad der kan være årsagen til, at Array.prototype er en matrix, harlength
intet at gøre med det. - Hvorfor kan ' t det være et almindeligt objekt med alle egenskaber såsom push osv implementeret, så Array Instance arver fra det?
array
ikke fuldt funktionel? " Og jeg synes svaret på det er indlysende: af de samme grunde, at du deler funktionerne i en klasse i en abstrakt klasse og en klasse, der arver fra det.Array.prototype
er mere endObject
? Mere i betydningen at give mulighed for at gemme elementer.[42]
er i det væsentlige den samme ting som{ "0": 42 }
men med en anden prototype og den funkylength
egenskab.length
egenskab, der forøges for hver ejendom, der er gemt i objektet. Det er her, jeg siger, atArray.prototype
er et fuldt funktionelt array.