我正在尝试将一个函数添加到每个对象都可以访问的对象数组中,但不需要将它们分别添加到每个对象中。
让我举一个简短的例子。
假设我有一个包含类似对象的数组,每个对象都有一个属性x和一个属性y:
var objects = [{x:1, y:2},
{x:0, y:5},
{x:3, y:14}
];
我想为任何对象计算x
和y
的总和。
第一种方法:
为了计算给定对象的总和,可以将此对象传递给预定义函数,如下所示:
function xySum1(o) {return o.x + o.y;}
objects[0].x //--> returns 1
objects[0].y //--> returns 2
xySum1(objects[0]) //--> returns 3
这非常难看且不能令人满意,因为访问x
和y
属性的方式不同。此外,我的代码位于不同的位置,并且函数xySum1
不易被识别为被创建以对数组中的对象进行操作。
第二种方法:
可以遍历数组并将函数作为属性添加到每个对象:
for (var i=0; i < objects.length; i++) {
objects[i].xySum2 = function() {return this.x + this.y;};
}
现在,总和是通过
获得的objects[0].x //--> returns 1
objects[0].y //--> returns 2
objects[0].xySum2() //--> returns 3
哪个更好。
问题
然而,这种方法存在问题。首先,当我向数组中添加一个新元素时
objects.push({x:5,y:21});
然后在将函数添加到对象
之前无法计算总和objects[3].xySum2() //-->TypeError
另一个问题是我有很多对象,还有很多要添加的功能。将每个函数单独添加到每个对象似乎浪费了良好的内存空间。
有没有办法更有效地做到这一点?
答案 0 :(得分:8)
定义一个类:
function MyObject(x, y) {
this.x = x;
this.y = y;
}
MyObject.prototype = {
xySum2: function() {
return this.x + this.y;
}, x: 0, y: 0
};
然后你可以这样做:
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
或者,这就是Bergi可能想在评论中说的话:
objects.xySum = function(index) {
return this[index].x + this[index].y;
};
这种方法有点“肮脏”,但内存消耗也较少。