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
lengthegenskap är instansnivåegenskap. Varje matrisinstans har sitt egetlength-värde. Varför skulle du placeralengthegenskapen iArray.prototype? Det vore vettigt att placeralengthegenskap iArraykonstruktörfunktion, vid instantiering kommer varje instans att ha sin egenlengthegenskap som anger arraylängd. Menlengthegenskap förArraykonstruktorfunktion 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 egenlengthegendom, blir den deladelengthskuggad 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
lengthegenskap 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,lengthhar 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?
arrayinte 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 funkylengthegendom.lengthegenskap som ökas för varje egendom som lagras i objektet. Det är här jag säger attArray.prototypeär en fullt fungerande array.