数组中所有对象之间的javascript函数共享

ElR*_*udi 6 javascript

我正在尝试向每个对象都可以访问的对象数组添加一个函数,但不需要将它们分别添加到每个对象中.

让我举个简短的例子.

假设我有一个包含类似对象的数组,每个对象都有一个属性x和一个属性y:

var objects = [{x:1, y:2},
               {x:0, y:5},
               {x:3, y:14}
              ];
Run Code Online (Sandbox Code Playgroud)

我想计算任何对象的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
Run Code Online (Sandbox Code Playgroud)

这是非常丑陋和不令人满意的,因为访问xy属性是不同的.此外,我的代码位于不同的位置,并且该函数xySum1不易被识别为被创建以对数组中的对象进行操作.

第二种方法:

可以循环遍历数组并将函数作为属性添加到每个对象:

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

现在,总和是通过

objects[0].x        //--> returns 1
objects[0].y        //--> returns 2
objects[0].xySum2() //--> returns 3
Run Code Online (Sandbox Code Playgroud)

这要好得多.

问题

但是,这种方法存在问题.首先,当我向数组添加一个新元素时

objects.push({x:5,y:21});
Run Code Online (Sandbox Code Playgroud)

然后在将函数添加到对象之前无法计算总和

objects[3].xySum2() //-->TypeError
Run Code Online (Sandbox Code Playgroud)

另一个问题是我有很多对象,并且有许多功能要添加到它们中.将每个函数单独添加到每个对象似乎浪费了良好的内存空间.

有没有办法更有效地做到这一点?

Max*_*Art 8

定义一个类:

function MyObject(x, y) {
    this.x = x;
    this.y = y;
}
MyObject.prototype = {
    xySum2: function() {
        return this.x + this.y;
    }, x: 0, y: 0
};
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

另外,这也是Bergi在评论中可能想说的:

objects.xySum = function(index) {
    return this[index].x + this[index].y;
};
Run Code Online (Sandbox Code Playgroud)

这种方法有点"肮脏",但内存消耗也较少.