Prototyp in diesem Array-Slice-Aufruf, warum?

8

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?

    
Steve Claridge 20.07.2011, 14:30
quelle

5 Antworten

7
  

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.

@ Pointy sagt, Sie könnten einen Verweis auf die Methode mit einer Array-Instanz erhalten:

%Vor%

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 Einweg Objekt, so wird es irgendwann auch in Bezug auf die Leistung genau dasselbe sein.

    
CMS 20.07.2011, 14:35
quelle
3

Es sollte beachtet werden, dass:

%Vor%

funktioniert auch, denn wenn "slice" eine Referenz auf eine Funktion des Prototyps für den Array-Konstruktor ist, dann ist "slice" auf einem konstruierten Array (daher) genau dieselbe Funktion.

    
Pointy 20.07.2011 14:39
quelle
2

Array.slice existiert nicht (zumindest nicht in Chrome).

slice ist Teil des Prototyps für Array -Objekte, keine Methode für Array selbst. Um darauf zu verweisen, müssen Sie den Prototyp durchlaufen.

    
Herms 20.07.2011 14:35
quelle
2

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.

    
Sascha Goebel 20.07.2011 14:36
quelle
2

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:

%Vor%

Was würde Ihnen erlauben, dies zu tun:

%Vor%     
Matthew Caruana Galizia 20.07.2011 14:44
quelle