Ich habe die MDN-Seite für die Argumente der JS-Funktion gelesen:
Ich verstehe, dass Argumente kein Array ist, also wird das nicht funktionieren:
%Vor%Die Lösung auf MDN ist dies tun:
%Vor% Warum Array.prototype
und nicht nur Array.slice.call(arguments)
verwenden? Ist der Prototyp hier wichtig?
Warum Array.prototype und nicht nur Array.slice.call (Argumente) verwenden?
Die Methode Array.slice
ist Teil der Array- und String-Generics eine Reihe von "statischen" Methoden, die als Eigenschaften der Konstruktoren Array
und String
implementiert sind.
Diese Methoden sind nicht standardmässig , sie sind nur in Mozilla-basierten Implementierungen verfügbar.
Ich habe eine Menge Verwirrung zwischen diesen und den Standard-Methoden gesehen, aber Sie sollten wissen, dass sie nicht gleich sind, wenn Sie Folgendes testen:
%Vor%Sie werden feststellen, dass es sich um verschiedene Methoden handelt.
Wenn Sie diese Methode verwenden, müssen Sie übrigens nicht die Methode call
verwenden, das erste Argument ist das Objekt, das als this
-Wert ( Array.slice(arguments)
) verwendet wird.
Benutzt man den Prototyp hier?
Ja, der Array
-Konstruktor ist nur eine Funktion, die Standardmethode slice
und alle anderen "Array-Methoden" sind auf Array.prototype
definiert.
Dieses Objekt, Array.prototype
, ist derjenige, von dem alle Array-Objektinstanzen erben.
Dies wird theoretisch ein neues Array-Objekt erstellen und auf die Methode slice
in der Prototypkette zugreifen, aber ich erinnere mich, dass einige Implementierungen beginnen, diese Art des Eigenschaftszugriffs zu optimieren, indem die Erzeugung von
prototype enthält alle Funktionen, die für "Array" -Objekte verfügbar sind. Array selbst bezieht sich nur auf den Konstruktor. Daher müssen Sie die Funktion aus den Prototypen holen und sie auf die Argumente des Pseudo-Arrays anwenden.
Kurze Antwort: Ja, prototype
ist signifikant.
slice
ist eine Eigenschaft des Objekts prototype
des Array-Objekts. Wenn Array.slice
existieren würde, wäre dies eine Eigenschaft der Array-Konstruktorfunktion.
Zum Beispiel, wenn Sie schreiben:
%Vor%someFunc ist eine Eigenschaft des MyConstructor-Funktionsobjekts, so dass dies nicht funktioniert:
%Vor%Aber das wird:
%Vor% Wenn Sie Eigenschaften für alle Instanzen verfügbar haben möchten, müssen Sie sie zum Objekt prototype
Ihres Konstruktors hinzufügen. Zum Beispiel:
Was würde Ihnen erlauben, dies zu tun:
%Vor%Tags und Links javascript prototype-programming