Sicherung :
Wir verwenden diese Codezeile, wenn wir die Argumente Array-artig in Array-artig umwandeln:
var arg = Array.prototype.slice.call(Argumente)
Warum also Array.prototype.slice.call, nicht Array.slice.call
Sie befinden sich alle auf einer Prototyp-Kette, sollte es nicht möglich sein, Aufrufe automatisch von unten nach oben zu finden? // naive Idee
Falsch, nicht auf einer Prototypkette
Die Theorie ist folgende: Ich kann die Methode zum Aufrufen von Array nicht finden und gehe dann zu Array.__proto__ statt zu Array.prototype
Und:
Array.__proto__ === Array.prototype
//false
Dann lassen Sie mich darüber nachdenken, was Array.__proto__ ist? ist Object.prototype?
Array.__proto__===Object.prototype
//false,也不对
Array ist ein Konstruktor, dann ist es eine Instanz von Function, es sollte so aussehen:
Array.__proto__ === Function.prototype
//true
zurück zur Ausgangsfrage
Auf diese Weise können wir verstehen, warum Array.slice.call nicht verwendet werden kann, denn obwohl Array ein Konstruktor ist, ist es auch ein Funktionsobjekt. Es gibt _ proto__, und Slice kann nicht in Array gefunden werden. Natürlich gibt es kein eins in _ proto__ von Array. .
Das Slice befindet sich in Array.prototype.
zwei wichtige Punkte
1. Wenn Sie das Attribut nicht finden können, gehen Sie zu __proto__, um es zu finden, nicht zu .prototype.
2. Konstruktoren sind auch Funktionsobjekte, vergessen Sie nicht, dass sie Instanzen von Function sind.
3. Nur Konstrukteure haben Prototypen.