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