Warum ist Array.prototype als voll funktionsfähiges Array konzipiert?

In der folgenden Visualisierung

Geben Sie hier die Bildbeschreibung ein.

Es gibt zwei Array-Objekte (cars & bikes), die mit der folgenden Syntax erstellt wurden,

var cars = new Array("Saab", "Volvo", "BMW"); var bikes = ["Honda", "Yamaha"]; 

dessen [[Class]] Der Eigenschaftswert ist Array.

Zusätzlich haben wir auch Array.prototype, das ein voll funktionsfähiges Array ist

> Object.prototype.toString.call(Array.prototype); "[object Array]" > Array.prototype[0] = "Volvo"; "Volvo" > Array.prototype[1] = "BMW"; "BMW" > Array.prototype.length; 2 

Wenn Sie etwas auf die prototype setzen, teilt im Allgemeinen jede Instanz des Objekts die gleiche Eigenschaften.

Frage:

Mit der Eigenschaft length als Mitglied: Welche Idee steckt hinter Array.prototype voll funktionsfähiges Array?

Kommentare

  • Mein Verständnis ist, dass < Objekt > .pr ototype ist immer ein Objekt, da der springende Punkt eines Prototyps darin besteht, dass es sich ' um eine Zuordnung von Methodennamen zu tatsächlichen Methoden handelt, die von mehreren verschiedenen Objekten gemeinsam genutzt werden. Die Tatsache, dass Array.prototype auch ein Array ist, hängt damit zusammen, dass alle Arrays spezielle Objekte sind. Fragen Sie sich, warum Array.prototype ein Array und kein reguläres Objekt ist? Oder warum JS-Prototypen nicht auf Zeichenfolgen beschränkt sind – > Funktionszuordnungen? Oder warum JS-Arrays spezielle Objekte sind? Oder etwas anderes?
  • Sie ' stellen wahrscheinlich die falsche Frage. Die richtige Frage lautet " Warum ist ' t array nicht voll funktionsfähig? " Und ich denke, die Antwort darauf liegt auf der Hand: Aus den gleichen Gründen, aus denen Sie die Funktionalität einer Klasse in eine abstrakte Klasse und eine Klasse aufteilen, von der erbt it.
  • @Ixrec Warum ist Array.prototype mehr als Object? Mehr im Sinne einer Möglichkeit zum Speichern von Elementen.
  • @overexchange Objekte speichern jedoch auch Elemente. Wenn Sie das Speichern von Elementen mit Ganzzahlschlüsseln meinen, tun Arrays ' dies auch nicht, da Arrays Objekte sind. Die Ganzzahlschlüssel werden immer in Zeichenfolgen konvertiert (weil Javascript etwas seltsam ist). [42] ist im Wesentlichen dasselbe wie { "0": 42 }, jedoch mit einem anderen Prototyp und diesem funky length Eigenschaft.
  • @Ixrec Aber nicht alle Objekte haben die Eigenschaft length, die für jede im Objekt gespeicherte Eigenschaft inkrementiert wird. Hier sage ich, dass Array.prototype ein voll funktionsfähiges Array ist.

Antwort

Der Array-Prototyp ist selbst ein voll funktionsfähiges Array, da er alle Funktionen enthalten muss, die erforderlich sind, damit ein Objekt als Array fungiert. Die Array-Instanzen erben ihre gesamte Funktionalität über den Prototyp.

Gemäß der Spezifikation :

Das Array-Prototypobjekt ist selbst ein Array. Die [[Klasse]] ist „Array“ und hat eine Längeneigenschaft (deren Anfangswert +0 ist) und die in 15.4.5.1 beschriebene spezielle interne Methode [[DefineOwnProperty]].

Kommentare

  • Die Eigenschaft length ist jedoch eine Eigenschaft auf Instanzebene. Jede Array-Instanz hat einen eigenen length -Wert. Warum sollten Sie die Eigenschaft length in Array.prototype einfügen? Es wäre sinnvoll, die Eigenschaft length in die Konstruktorfunktion Array zu setzen. Bei der Instanziierung hat jede Instanz ihre eigene length Eigenschaft, die die Arraylänge angibt. Die length -Eigenschaft der Array -Konstruktorfunktion gibt jedoch die Anzahl der Argumente an, die von der Konstruktorfunktion
  • @overexchange: Objects erwartet werden Eigenschaften nicht vom Konstruktor erben, sondern nur vom Prototyp. Daher hat die Array.length keine Beziehung zur Array.prototype.length.
  • @JacquesB Dies bedeutet, dass length eine gemeinsame Eigenschaft aller Array-Instanzen und as ist Sobald eine Instanz ihre eigene length -Eigenschaft ändert, wird diese gemeinsam genutzte length schattiert und ist daher unbrauchbar (da jede arithmetische Operation zu einer Schattierung führt zB x.length++ ist tatsächlich x.length = x.length + 1). Ist diese Eigenschaft Ihrer Meinung nach die einzige Verwendung, sodass alle Array-Instanzen eine anfängliche length -Eigenschaft erhalten?
  • Jedes Array-Objekt hat eine length -Eigenschaft, die in keiner Weise von Array.prototype.length abgeleitet ist.Versuchen Sie einfach, Array.prototype[10] = 42 einzustellen, wodurch Array.prototype.length gleich 11 wird, aber neu erstellte Arrays übernehmen dies natürlich nicht. Sie erben das Element – versuchen Sie [][10]. Kaum ein wünschenswertes Verhalten. Was auch immer der Grund dafür sein mag, dass Array.prototype ein Array ist, length hat nichts damit zu tun.
  • Warum kann ' Ist es kein gewöhnliches Objekt, in dem alle Eigenschaften wie Push usw. implementiert sind, sodass die Array-Instanz davon erbt?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.