Próbuję dodać funkcję do tablicy obiektów, do której każdy obiekt ma dostęp, ale która nie musi być dodawana do każdego obiektu osobno.Udostępnianie funkcji javascript między wszystkimi obiektami w tablicy
Pozwól, że dam ci krótki przykład.
Powiedzmy mam tablicę zawierającą podobne obiekty, z których każdy posiada właściwości x i y nieruchomości:
var objects = [{x:1, y:2},
{x:0, y:5},
{x:3, y:14}
];
Chciałbym obliczyć sumę x
i y
dla każdego z obiektów.
Pierwsze podejście:
Aby obliczyć sumę dla danego obiektu, można przekazać ten obiekt do predefiniowanych funkcji tak:
function xySum1(o) {return o.x + o.y;}
objects[0].x //--> returns 1
objects[0].y //--> returns 2
xySum1(objects[0]) //--> returns 3
Jest to dość brzydki i niezadowalające, ponieważ dostęp do właściwości x
i y
odbywa się inaczej. Ponadto mój kod znajduje się w różnych lokalizacjach, a funkcja xySum1
nie jest łatwo rozpoznawalna jako utworzona do działania na obiektach w tablicy.
Drugie podejście:
Można by pętli tablicy i dodać funkcję jako właściwość do każdego obiektu:
for (var i=0; i < objects.length; i++) {
objects[i].xySum2 = function() {return this.x + this.y;};
}
Teraz suma jest uzyskiwana przez
objects[0].x //--> returns 1
objects[0].y //--> returns 2
objects[0].xySum2() //--> returns 3
co jest znacznie lepsze.
Problemy
Istnieją jednak pewne problemy z tym podejściem. Po pierwsze, kiedy dodać nowy element do tablicy
objects.push({x:5,y:21});
czym suma nie mogą być obliczone przed funkcja została dodana do obiektu
objects[3].xySum2() //-->TypeError
Innym problemem jest to, że wiele obiektów i wiele funkcji do dodania. Wydaje się, że marnowanie dobrej pamięci pozwala na dodanie każdej funkcji do każdego obiektu osobno.
Czy istnieje sposób, aby zrobić to bardziej efektywnie?
Co z 'objects.xySum (0)'? – Bergi
może zdefiniować konstruktora, a następnie funkcje będą w prototypie? – user2264587
Możesz również zdefiniować metodę Object.prototype w następujący sposób: 'Object.prototype.xySum = function() {return typeof this.x! == 'undefined' && typeof this.y! == 'undefined'? this.x + this.y: undefined;} '. – dfsq