Perché Array.prototype è progettato per essere un array completamente funzionale?

Nella visualizzazione di seguito,

inserisci qui la descrizione dellimmagine

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

  • La mia comprensione è che < oggetto > .pr ototype è sempre un oggetto, perché il punto centrale di un prototipo è che ' è una mappa dai nomi dei metodi ai metodi effettivi condivisi da diversi oggetti diversi. Il fatto che Array.prototype sia anche un array è correlato al fatto che tutti gli array sono oggetti speciali. Stai chiedendo perché Array.prototype è un array e non un oggetto normale? O perché i prototipi JS non si limitano a essere stringhe – > mappe di funzioni? O perché gli array JS sono oggetti speciali? O qualcosaltro?
  • ' probabilmente stai facendo la domanda sbagliata. La domanda giusta è " perché ' t 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.
  • @Ixrec Perché Array.prototype è più di Object? Più nel senso di fornire funzionalità per memorizzare elementi.
  • @overexchange Ma gli oggetti memorizzano anche elementi. Se intendi memorizzare elementi con chiavi intere, gli array non ' lo fanno, perché gli array sono oggetti. Le chiavi intere vengono sempre convertite in stringhe (perché Javascript è un po strano). [42] è essenzialmente la stessa cosa di { "0": 42 } ma con un prototipo diverso e quel bizzarro length proprietà.
  • @Ixrec Ma non tutti gli oggetti hanno la proprietà length che viene incrementata per ogni proprietà memorizzata nelloggetto. È qui che dico che Array.prototype è un array completamente funzionale.

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 valore length. Perché dovresti inserire la proprietà length in Array.prototype? Avrebbe senso inserire la proprietà length nella funzione di costruzione Array, dopo listanza, ogni istanza avrà la propria length proprietà che indica la lunghezza dellarray. Ma la proprietà length della funzione di costruzione Array 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, quella length 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 da Array.prototype.length.Prova a impostare Array.prototype[10] = 42, il che rende Array.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?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *