In der folgenden Visualisierung
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 alsObject
? 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 funkylength
Eigenschaft. - @Ixrec Aber nicht alle Objekte haben die Eigenschaft
length
, die für jede im Objekt gespeicherte Eigenschaft inkrementiert wird. Hier sage ich, dassArray.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 eigenenlength
-Wert. Warum sollten Sie die Eigenschaftlength
inArray.prototype
einfügen? Es wäre sinnvoll, die Eigenschaftlength
in die KonstruktorfunktionArray
zu setzen. Bei der Instanziierung hat jede Instanz ihre eigenelength
Eigenschaft, die die Arraylänge angibt. Dielength
-Eigenschaft derArray
-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 eigenelength
-Eigenschaft ändert, wird diese gemeinsam genutztelength
schattiert und ist daher unbrauchbar (da jede arithmetische Operation zu einer Schattierung führt zBx.length++
ist tatsächlichx.length = x.length + 1
). Ist diese Eigenschaft Ihrer Meinung nach die einzige Verwendung, sodass alle Array-Instanzen eine anfänglichelength
-Eigenschaft erhalten? - Jedes Array-Objekt hat eine
length
-Eigenschaft, die in keiner Weise vonArray.prototype.length
abgeleitet ist.Versuchen Sie einfach,Array.prototype[10] = 42
einzustellen, wodurchArray.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?