2013-04-20 13 views
6

Ich versuche, eine Funktion zu einem Array von Objekten hinzuzufügen, auf die jedes Objekt Zugriff hat, die jedoch nicht jedem Objekt separat hinzugefügt werden müssen.Javascript Funktionsfreigabe zwischen allen Objekten in einem Array

Lassen Sie mich Ihnen ein kurzes Beispiel geben.

Lassen Sie uns sagen, ich habe ein Array ähnliche Objekte enthält, die jeweils eine Eigenschaft x und einer Eigenschaft y:

var objects = [{x:1, y:2}, 
       {x:0, y:5}, 
       {x:3, y:14} 
       ]; 

Ich möchte die Summe von x und y für eines der Objekte berechnen.

Erster Ansatz:

Um die Summe für ein bestimmtes Objekt zu berechnen, eine Lösung dieser Aufgabe auf eine vordefinierte Funktion wie so passieren könnte:

function xySum1(o) {return o.x + o.y;} 

objects[0].x  //--> returns 1 
objects[0].y  //--> returns 2 
xySum1(objects[0]) //--> returns 3 

Das ist ziemlich hässlich und unbefriedigend, als Zugriff auf die x und y Eigenschaften ist anders gemacht. Außerdem befindet sich mein Code an verschiedenen Stellen, und die Funktion xySum1 ist nicht so einfach zu erkennen, als ob sie erstellt wurde, um auf die Objekte im Array zu wirken.

Zweiter Ansatz:

Man könnte das Array durchlaufen und die Funktion als Eigenschaft für jedes Objekt hinzufügen:

for (var i=0; i < objects.length; i++) { 
    objects[i].xySum2 = function() {return this.x + this.y;}; 
} 

nun die Summe von

objects[0].x  //--> returns 1 
objects[0].y  //--> returns 2 
objects[0].xySum2() //--> returns 3 
erhalten

was viel besser ist.

Probleme

Es gibt jedoch Probleme mit diesem Ansatz. Erstens, wenn ich ein neues Element in das Array

objects.push({x:5,y:21}); 

dann die Summe nicht berechnet werden kann hinzufügen, bevor die Funktion zum Objekt hinzugefügt wurde

objects[3].xySum2() //-->TypeError 

Ein weiteres Problem ist, dass ich viele Objekte haben, und viele Funktionen, um sie hinzuzufügen. Es scheint eine Verschwendung von gutem Speicherplatz zu sein, jede Funktion zu jedem Objekt einzeln hinzuzufügen.

Gibt es eine Möglichkeit, dies effizienter zu tun?

+6

Was ist mit 'objects.xySum (0)'? – Bergi

+0

vielleicht einen Konstruktor definieren, dann werden die Funktionen im Prototyp sein? – user2264587

+0

Sie können auch eine Object.prototype-Methode folgendermaßen definieren: 'Object.prototype.xySum = function() {Rückgabetyp von this.x! == 'undefined' && typeof this.y! == 'undefined'? this.x + this.y: undefiniert;} '. – dfsq

Antwort

8

eine Klasse definieren:

function MyObject(x, y) { 
    this.x = x; 
    this.y = y; 
} 
MyObject.prototype = { 
    xySum2: function() { 
     return this.x + this.y; 
    }, x: 0, y: 0 
}; 

Dann können Sie tun:

var objects = [ 
    new MyObject(1, 2), 
    new MyObject(0, 5), 
    new MyObject(3, 14) 
]; 
objects[0].xySum2(); // 3 

objects.push(new MyObject(5, 21)); 
objects[3].xySum2(); // 26 

Alternativ ist es das, was Bergi wahrscheinlich in seinem Kommentar sagen wollte:

objects.xySum = function(index) { 
    return this[index].x + this[index].y; 
}; 

Dieser Ansatz ist ein bisschen "dreckiger", aber auch weniger speicherintensiv.

+1

Danke MaxArt für Ihre Antwort. Gibt es eine Möglichkeit, dies zu tun, nachdem das Array von Objekten bereits erstellt wurde? Ich frage, wie es von einem anderen Teil des Programms, der außerhalb meiner Kontrolle ist, übergeben wird. – ElRudi

+0

@ElRudi In diesem Fall schlage ich vor, die Alternative zu verwenden: Definieren Sie die Funktion des Arrays "objects" und Sie sind fertig. Denken Sie daran, es in jeder Kopie oder Abschnitt, die Sie von 'Optionen' machen werden, neu zu definieren. Oder Sie können immer ein eigenes Array von 'MyObject's erstellen, indem Sie die Elemente von' objects' verwenden, wie in 'newMyObject (objects [i] .x, objects [i] .y)' – MaxArt

+0

Also meine Optionen: (1) Definieren Sie eine Klasse, fügen Sie dem Prototyp eine gewünschte Funktion hinzu - und durchlaufen Sie alle Objekte im erlangten Array, um für jede Instanz der Klasse mit den gleichen Eigenschaften (2) die Funktion zum Prototyp des Objekts zu erstellen statt dessen, was eine schreckliche Kodierungspraxis sein kann oder nicht - mit dem Vorteil weniger Codezeilen und weniger Durchlaufen von Arrays, oder (3) Hinzufügen der Funktion zum _array_ anstatt zu den einzelnen Objekten - mit dem Nachteil, dass es verwendet wird unterscheidet sich syntaktisch von anderen Eigenschaften und wird nicht zusammen mit Objektdaten kopiert. Ist ungefähr richtig? – ElRudi

Verwandte Themen