JS - 数组中每个对象的相同功能

时间:2013-03-04 17:23:44

标签: javascript jquery oop

我有像棋盘这样的二维对象数组。

您可以通过data.field(x,y);获取对象(对象存储在2d对象数组中)

我希望每个字段都有函数:topbottomleftright将返回邻居字段。

例如data.field(3,3).top().left().bottom().name将返回字段名称(4,3)。

但是:我是否要为每个对象声明这些功能?我的意思是,例如在8x8字段上将是64个相同功能的实例:

data.field(0,0).top = function(){...}
data.field(0,1).top = function(){...}
...

Ofc我可以很容易地在循环内声明它们,但它纯粹浪费了内存,我确信它不是这样做的。是否可以在field(x,y)函数返回的每个对象中仅声明此函数一次?

2 个答案:

答案 0 :(得分:1)

  

是否可以在field(x,y)函数返回的每个对象中仅声明此函数一次?

绝对:

function top() {
    // ...do your thing, using `this`
}

data.field(0,0).top = top;

top作为从field(0,0)对象检索它的表达式的一部分调用时,在top的调用中,this将是field(0,0)宾语。同样适用于field(0,1)

更多(在我的博客上):

现在,假设无论出于何种原因,您已经拥有field(0,0)和此类对象(可能它们是由您无法控制的代码创建的)。如果你控制代码,你可以通过原型链代替:

function Field() {
}
Field.prototype.top = function() {
    // ...do your top thing, using `this`
};

...并在创建字段时:

yourField = new Field();

所以这取决于data.fields(0,0)是什么以及你得到它。

答案 1 :(得分:0)

如果你想节省内存,你应该看看原型。它们就像面向对象语言中的类,因此存在内存优化的机会。

var Field = function() {}; // this is your constructor
Field.prototype.top = function () { /* .. */
    return this; // return the field so you can do chaining: field.top().left();
};
Field.prototype.left = function () { /* .. */
    return this;
};
/* .. */
var field = new Field();
data.set(0, 0, field);
data.field(0, 0).top().left();