Nella visualizzazione di seguito,
Sono presenti due oggetti array (cars
& bikes
) creati con la seguente sintassi,
var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"];
cui [[Class]]
il valore della proprietà è Array
.
Inoltre, abbiamo anche Array.prototype
, che è un array completamente funzionale, come mostrato sotto,
> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2
In genere, quando metti qualcosa su prototype
, ogni istanza delloggetto condivide il stesse proprietà.
Domanda:
Con la proprietà length
come membro, qual è lidea alla base di Array.prototype
è un array completamente funzionale?
Commenti
Risposta
Il prototipo di array è esso stesso un array completamente funzionale, perché deve contenere tutte le funzionalità necessarie affinché un oggetto funzioni come array. Le istanze di array ereditano tutte le loro funzionalità attraverso il prototipo.
Secondo la specifica :
Loggetto prototipo Array è esso stesso un array; la sua [[Class]] è “Array” e ha una proprietà length (il cui valore iniziale è +0) e il metodo interno speciale [[DefineOwnProperty]] descritto in 15.4.5.1.
Commenti
- Ma la proprietà
length
è a livello di istanza. Ogni istanza di array ha il proprio valorelength
. Perché dovresti inserire la proprietàlength
inArray.prototype
? Avrebbe senso inserire la proprietàlength
nella funzione di costruzioneArray
, dopo listanza, ogni istanza avrà la proprialength
proprietà che indica la lunghezza dellarray. Ma la proprietàlength
della funzione di costruzioneArray
indica il numero di argomenti previsti dalla funzione di costruzione - @overexchange: gli oggetti sì non eredita le proprietà dal costruttore, solo dal prototipo. Pertanto Array.length non ha alcuna relazione con Array.prototype.length.
- @JacquesB Ciò significa che
length
è una proprietà condivisa tra tutte le istanze dellarray e come non appena unistanza modifica la propria proprietàlength
, quellalength
condivisa diventa ombreggiata e quindi inutile (poiché qualsiasi operazione aritmetica risulta in ad esempio,x.length++
è in realtàx.length = x.length + 1
). Quindi, secondo te, lunico uso di quella proprietà è in modo che tutte le istanze di array ottengano una proprietàlength
? - Ogni oggetto array ha un
length
proprietà che non deriva in alcun modo daArray.prototype.length
.Prova a impostareArray.prototype[10] = 42
, il che rendeArray.prototype.length
uguale a 11, ma ovviamente gli array appena creati non lo rilevano. Ereditano lelemento: prova[][10]
. Difficilmente un comportamento desiderabile. Qualunque sia la ragione per cui Array.prototype è un array,length
non ha nulla a che fare con esso. - Perché può ' è un oggetto ordinario con tutte le proprietà come push, ecc. implementate, in modo che listanza dellarray erediti da esso?
array
non è completamente funzionante? " E penso che la risposta sia ovvia: per gli stessi motivi per cui dividi la funzionalità di una classe in una classe astratta e una classe che eredita da it.Array.prototype
è più diObject
? Più nel senso di fornire funzionalità per memorizzare elementi.[42]
è essenzialmente la stessa cosa di{ "0": 42 }
ma con un prototipo diverso e quel bizzarrolength
proprietà.length
che viene incrementata per ogni proprietà memorizzata nelloggetto. È qui che dico cheArray.prototype
è un array completamente funzionale.