Her nesnenin erişime sahip olduğu, ancak her bir nesneye ayrı olarak eklenmesinin gerekmediği bir nesne dizisine işlev eklemeye çalışıyorum.Bir dizideki tüm nesneler arasındaki javascript işlevi paylaşımı
Size kısa bir örnek vereyim.
en her biri bir özelliği x ve bir özellik y sahip olan, bir dizi benzer nesneler içeren olduğunu varsayalım:var objects = [{x:1, y:2},
{x:0, y:5},
{x:3, y:14}
];
nesneler için herhangi bir x
ve y
toplamını hesaplamak istiyoruz.
İlk yaklaşım: belirli bir nesne için toplamını hesaplamak için
, bir çok gibi önceden belirlenmiş bir işlevi için bu nesneyi geçebileceği:
Bu oldukça çirkin ve tatmin edicifunction xySum1(o) {return o.x + o.y;}
objects[0].x //--> returns 1
objects[0].y //--> returns 2
xySum1(objects[0]) //--> returns 3
, x
ve y
özelliklerine erişim farklı şekilde yapılır. Ayrıca, kodum farklı konumlardadır ve xySum1
işlevi, dizideki nesneler üzerinde hareket etmek için oluşturulduğu gibi kolayca tanınabilir değildir.
İkinci yaklaşım:
Bir olabilir dizi döngü ve her bir nesne için bir özellik olarak işlev eklemek:
for (var i=0; i < objects.length; i++) {
objects[i].xySum2 = function() {return this.x + this.y;};
}
Şimdi, toplam
objects[0].x //--> returns 1
objects[0].y //--> returns 2
objects[0].xySum2() //--> returns 3
elde edilir
çok daha iyi.
Sorunları
bu yaklaşımla, ancak, sorunlar vardır. I dizi daha sonra
objects.push({x:5,y:21});
bir yenisini eklerken işlev nesnesinin
objects[3].xySum2() //-->TypeError
Başka bir problem ilave edilmeden önce ilk olarak, toplam hesaplanamaz birçok nesne olması ve onlara eklenecek birçok işlev. Her bir işleve ayrı ayrı her bir nesneyi eklemek için iyi bir hafıza alanı kaybı gibi görünüyor.
Bunu daha verimli yapmanın bir yolu var mı?
function MyObject(x, y) {
this.x = x;
this.y = y;
}
MyObject.prototype = {
xySum2: function() {
return this.x + this.y;
}, x: 0, y: 0
};
Sonra yapabilirsiniz:
'objects.xySum (0) 'nedir? – Bergi
belki bir kurucu tanımlar, daha sonra işlevler prototipte olur mu? – user2264587
Ayrıca şöyle bir Object.prototype yöntemi tanımlayabilirsiniz: Object.prototype.xySum = function() {return typeof this.x! == 'undefined' && typeof this.y! == 'undefined'? this.x + this.y: undefined;} '. – dfsq