Hvorfor er Array.prototype designet til at være et fuldt funktionelt array?

I nedenstående visualisering

indtast billedbeskrivelse her

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

  • Min forståelse er, at < objekt > .pr ototype er altid et objekt, fordi hele prototypens pointe er, at det ' er et kort fra metodenavne til aktuelle metoder, der deles af flere forskellige objekter. Det faktum, at Array.prototype også er en matrix, er relateret til det faktum, at alle arrays er specielle objekter. Spørg du hvorfor Array.prototype er en matrix og ikke et almindeligt objekt? Eller hvorfor er JS-prototyper ikke begrænset til at være streng – > funktionskort? Eller hvorfor er JS-arrays specielle objekter? Eller noget andet?
  • Du ' stiller sandsynligvis det forkerte spørgsmål. Det rigtige spørgsmål er " hvorfor er ' t 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.
  • @Ixrec Hvorfor Array.prototype er mere end Object? Mere i betydningen at give mulighed for at gemme elementer.
  • @overexchange Men genstande gemmer også elementer. Hvis du mener at gemme elementer med heltalstaster, gør arrays ikke ' det heller ikke, fordi arrays er objekter. Heltalsnøglerne konverteres altid til strenge (fordi Javascript er lidt underligt). [42] er i det væsentlige den samme ting som { "0": 42 } men med en anden prototype og den funky length egenskab.
  • @Ixrec Men ikke alle objekter har length egenskab, der forøges for hver ejendom, der er gemt i objektet. Det er her, jeg siger, at Array.prototype er et fuldt funktionelt array.

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 egen length værdi. Hvorfor placerer du egenskaben length i Array.prototype? Det ville være fornuftigt at placere length ejendom i Array konstruktorfunktion, efter instantiering vil hver instans have sin egen length egenskab, der betyder array længde. Men length egenskab for Array 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 egen length egenskab, bliver den delte length skygget og derfor ubrugelig (fordi enhver aritmetisk operation resulterer i en skygge forekommer, f.eks. x.length++ er faktisk x.length = x.length + 1). Så er den eneste anvendelse af denne egenskab ifølge dig, så alle matrixinstanser får en indledende length egenskab?
  • Hvert array-objekt har en length egenskab, der på ingen måde er afledt af Array.prototype.length.Prøv bare at indstille Array.prototype[10] = 42, hvilket gør Array.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, har length 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?

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *