2013-03-04 53 views
1

我已经有了像棋盘一样的2d数组对象。JS - 数组中的每个对象都具有相同的功能

您可以通过data.field(x,y);获取对象(对象存储对象的二维数组内)

我希望每个字段有功能:topbottomleftright将返回邻居场。

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

但是:我要为每个对象声明这些函数吗?我的意思是,例如在8×8场,这将是同样功能的64个实例:

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

OFC我可以很容易地声明它们内部循环,但内存和它纯粹是浪费我敢肯定它不是办法做到这一点。是否可以声明这个函数只有一次在field(x,y)函数返回的每个对象内都可用?

回答

1

是否有可能宣布这个功能只有一次是由字段(X,Y)函数返回的每一个对象里面avaliable?

绝对:

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)是和你在哪里得到它。

+0

@ alex23:什么不是关于将行为附加到对象的OOP? – 2013-03-04 17:27:27

+0

我是否还需要为每个领域做? data.field(0,0).top = top;数据(0,1).top = top等? – OPOPO 2013-03-04 17:27:42

+0

@OPOPO:你这样做,让我发表一个选择。但请注意,虽然您正在完成这项任务,但您不会重复该功能,而只是重复使用它。 – 2013-03-04 17:28:01

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(); 
相关问题