我有像棋盘这样的二维对象数组。
您可以通过data.field(x,y);
获取对象(对象存储在2d对象数组中)
我希望每个字段都有函数:top
,bottom
,left
,right
将返回邻居字段。
例如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)函数返回的每个对象中仅声明此函数一次?
答案 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();