2013-03-04 54 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(); 
相關問題