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?
Was ist mit 'objects.xySum (0)'? – Bergi
vielleicht einen Konstruktor definieren, dann werden die Funktionen im Prototyp sein? – user2264587
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