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
lengthegenskaben er instansniveauegenskab. Hver matrixinstans har sin egenlengthværdi. Hvorfor placerer du egenskabenlengthiArray.prototype? Det ville være fornuftigt at placerelengthejendom iArraykonstruktorfunktion, efter instantiering vil hver instans have sin egenlengthegenskab, der betyder array længde. Menlengthegenskab forArraykonstruktorfunktion 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
lengther en delt egenskab mellem alle array-forekomster og som snart en instans ændrer sin egenlengthegenskab, bliver den deltelengthskygget 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 indledendelengthegenskab? - Hvert array-objekt har en
lengthegenskab, der på ingen måde er afledt afArray.prototype.length.Prøv bare at indstilleArray.prototype[10] = 42, hvilket gørArray.prototype.lengthlig 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, harlengthintet 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?
arrayikke 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.prototypeer 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 funkylengthegenskab.lengthegenskab, der forøges for hver ejendom, der er gemt i objektet. Det er her, jeg siger, atArray.prototypeer et fuldt funktionelt array.