I nedanstående visualisering
Det finns två matrisobjekt (cars
& bikes
) som skapas med syntax nedan,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
vars [[Class]]
egenskapsvärde är Array
.
Dessutom har vi också Array.prototype
, som är en fullt fungerande matris, som visas nedan,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
Generellt, när du lägger något på prototype
, delar varje förekomst av objektet samma egenskaper.
Fråga:
Med length
egenskap som medlem, Vad är tanken bakom Array.prototype
vara fullt fungerande array?
Kommentarer
Svar
Array-prototypen är i sig en helt funktionell array, eftersom den måste innehålla alla funktioner som är nödvändiga för att ett objekt ska fungera som en array. Array-instanserna ärver all sin funktionalitet genom prototypen.
Enligt spec :
Array-prototypobjektet är i sig en matris; dess [[klass]] är ”Array” och den har en längdegenskap (vars ursprungliga värde är +0) och den speciella [[DefineOwnProperty]] interna metoden som beskrivs i 15.4.5.1.
Kommentarer
- Men
length
egenskap är instansnivåegenskap. Varje matrisinstans har sitt egetlength
-värde. Varför skulle du placeralength
egenskapen iArray.prototype
? Det vore vettigt att placeralength
egenskap iArray
konstruktörfunktion, vid instantiering kommer varje instans att ha sin egenlength
egenskap som anger arraylängd. Menlength
egenskap förArray
konstruktorfunktion betyder antalet argument som förväntas av konstruktorfunktion - @overexchange: Objekt gör inte ärva egenskaper från konstruktören, bara från prototypen. Därför har Array.length ingen relation till Array.prototype.length.
- @JacquesB Detta betyder att
length
är en delad egenskap mellan alla arrayinstanser och som så snart en instans ändrar sin egenlength
egendom, blir den deladelength
skuggad och därför oanvändbar (eftersom all aritmetisk operation resulterar i en skuggning förekommer, t.ex.x.length++
är faktisktx.length = x.length + 1
). Så, är den enda användningen av den egenskapen, enligt dig, så att alla matrisinstanser får en initiallength
-egenskap? - Varje arrayobjekt har en
length
egenskap som inte på något sätt härrör frånArray.prototype.length
.Försök bara ställa inArray.prototype[10] = 42
, vilket gör attArray.prototype.length
är lika med 11, men naturligtvis tar nyskapade matriser inte upp detta. De ärver elementet – försök[][10]
. Knappast ett önskvärt beteende. Oavsett vad som kan vara anledningen till att Array.prototype är en array,length
har inget att göra med det. - Varför kan ' t det vara ett vanligt objekt med alla egenskaper som push etc implementerat, så att Array Instance ärver från det?
array
inte fullt fungerande? " Och jag tror att svaret på det är självklart: av samma skäl som att du delar funktionerna i en klass i en abstrakt klass och en klass som ärver från det.Array.prototype
är mer änObject
? Mer i betydelsen att tillhandahålla möjlighet att lagra element.[42]
är i princip samma sak som{ "0": 42 }
men med en annan prototyp och den funkylength
egendom.length
egenskap som ökas för varje egendom som lagras i objektet. Det är här jag säger attArray.prototype
är en fullt fungerande array.