Die beste Möglichkeit, Methoden zu einem vorhandenen Javascript-Objekt hinzuzufügen

8

Ich erhalte einen Ajax-Feed von Dokumenten, der ungefähr so ​​aussieht (viel vereinfacht):

%Vor%

Ich werde durch das aDocs-Array iterieren und Informationen über jedes Dokument anzeigen, während ich jedem Dokument Methoden hinzufüge, mit denen das HTML für die Anzeige geändert werden kann und API-Aufrufe zur Aktualisierung der Datenbank durchgeführt werden können.

Ich lese hier , dass Sie zum Hinzufügen von Methoden zu vorhandenen Objekten das Attribut __proto__ verwenden können. Etwas in der Art von:

%Vor%

Laut dem obigen Artikel ist dies kein offizielles JavaScript, wird nicht von IE unterstützt (wird nie sein) und wird wahrscheinlich in Webkit-Browsern veraltet sein.

Hier ist ein alternativer Stich:

%Vor%

Ist diese zweite Alternative lebensfähig und effizient? Oder erstelle ich diese Funktionen neu und erstelle damit einen redundanten Overhead?

Wieder sind die obigen Beispiele vereinfacht (ich weiß, dass aDocs[i].ext das obige Problem lösen wird, aber meine Methoden für Display- und API-Aufrufe sind komplizierter).

    
Eric H. 12.03.2013, 16:52
quelle

3 Antworten

7
  

Ist diese zweite Alternative lebensfähig und effizient?

Ja.

  

Oder erstelle ich diese Funktionen neu und erstelle damit einen redundanten Overhead?

Nein, die Funktionen werden wiederverwendet, nicht neu erstellt. Alle Objekte teilen sich die einzelne Kopie der Funktionen getExt und getTitle . Während des Aufrufs der Funktionen von (etwa) aDocs[1] verweist this innerhalb des Aufrufs auf das Objekt, an das die Funktion angehängt ist. (Dies gilt nur, wenn Sie es als Teil eines Ausdrucks aufrufen, der es vom Objekt abruft, z. B. var title = aDocs[1].getTitle(); )

Wenn Sie möchten, können Sie alternativ auch neue Objekte erstellen, die einen Prototyp gemeinsam nutzen, und die Eigenschaften aus den aDocs -Objekten in die neuen Objekte kopieren. Sie haben jedoch nach neuen Funktionen für existierende Objekte, also ...

    
T.J. Crowder 12.03.2013, 16:55
quelle
2

Das Vergrößern (Hinzufügen von Methoden) zu dem Prototyp ist oft der beste Weg, aber da Sie sich mit Objektliteralen (oder JSON.parse-Ergebnissen) beschäftigen, müssten Sie entweder erweitern die Object.prototype , die nicht gemacht ist, oder erstellen Sie einen Wrapper-Konstruktor mit den Methoden, die Sie an den Prototyp angehängt haben. Das Problem wird sein: in diesem Fall this in den Griff zu kriegen ... Ich würde die Dinge so belassen wie sie sind: benutze den zweiten Ansatz: eine einfache Schleife wird gut funktionieren. Übrigens: Prototyp-Methoden sind sowieso (marginal) langsamer ...

Die Funktionsobjekte selbst werden so schnell wie möglich erstellt (wenn sie im globalen Namespace definiert sind, werden sie erstellt, sobald das Skript analysiert wird). Wenn Sie einfach diese Objekte durchlaufen und jedem Objekt einen Verweis auf eine Funktion zuweisen , erstellen Sie keine zusätzlichen Funktionen.
Probieren Sie es einfach aus:

%Vor%

Es wurden viele Fragen (und Antworten) veröffentlicht, die sich eingehender mit dieser Angelegenheit befassen, also wenn Sie interessiert sind:

Objekte und Funktionen in JavaScript
Drucken Sie den Namen der Unterklasse anstelle von "Klasse" bei Verwendung der Vererbungsimplementierung der JavaScript-Klasse von John Resig
Was macht my.class.js so schnell?
Was sind die Unterschiede zwischen diesen drei Mustern von" Klassen "-Definitionen in JavaScript?

Sind alle mehr oder weniger auf Ihre Frage bezogen

    
Elias Van Ootegem 12.03.2013 17:03
quelle
1

In diesem Fall würde ich das Objekt einfach an den Konstruktor von Doc übergeben;

%Vor%

Es gibt zwei Probleme mit Ihrem Ansatz:

  • Sie müssen jede Methode für jede Instanz einzeln kopieren.
  • Ihre "Klasse" ist nirgendwo dokumentiert, daher macht es eine Klasse deutlicher, dass Ihr Objekt über diese Methoden verfügt.
Juan Mendes 12.03.2013 16:58
quelle

Tags und Links