Hvorfor er Array.prototype designet for å være et fullt funksjonelt utvalg?

I visualiseringen nedenfor,

skriv inn bildebeskrivelse her

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

  • Min forståelse er at < objekt > .pr ototype er alltid et objekt, fordi poenget med en prototype er at det ' er et kart fra metodenavn til faktiske metoder som deles av flere forskjellige objekter. Det faktum at Array.prototype også er en matrise er relatert til det faktum at alle matriser er spesielle objekter. Spør du hvorfor Array.prototype er en matrise og ikke et vanlig objekt? Eller hvorfor JS-prototyper ikke er begrenset til å være streng – > funksjonskart? Eller hvorfor er JS-matriser spesielle gjenstander? Eller noe annet?
  • Du ' stiller sannsynligvis feil spørsmål. Det rette spørsmålet er " hvorfor er ikke ' t 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.
  • @Ixrec Hvorfor Array.prototype er mer enn Object? Mer i betydningen å tilby muligheter for å lagre elementer.
  • @overexchange Men gjenstander lagrer også elementer. Hvis du mener å lagre elementer med heltallnøkler, gjør matriser ikke ' t heller, fordi arrays er objekter. Heltallstastene blir alltid konvertert til strenger (fordi Javascript er litt rart). [42] er egentlig det samme som { "0": 42 } men med en annen prototype og den funky length eiendom.
  • @Ixrec Men ikke alle objekter har length -egenskap som økes for hver eiendom som er lagret i objektet. Det er her jeg sier at Array.prototype er fullt funksjonell matrise.

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 egen length verdi. Hvorfor vil du plassere egenskapen length i Array.prototype? Det ville være fornuftig å plassere length eiendom i Array konstruktorfunksjon, ved øyeblikkelig øyeblikkelig vil hver forekomst ha sin egen length -egenskap som betyr arraylengde. Men length egenskapen til Array 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 egen length -egenskap, blir den delte length skyggelagt og derfor ubrukelig (fordi en aritmetisk operasjon resulterer i en skyggelegging forekommer, f.eks. x.length++ er faktisk x.length = x.length + 1). Så er den eneste bruken av den egenskapen, ifølge deg, slik at alle matriseinstanser får en innledende length -egenskap?
  • Hvert matriseobjekt har en length egenskap som på ingen måte er avledet fra Array.prototype.length.Bare prøv å sette Array.prototype[10] = 42, som gjør at Array.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, har length 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?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *