[編輯]將標題從「JS:用於收集或單個項目的異性二傳手/吸氣器?JS:動態對象交叉引用池
關於編寫混合getter/setter的能力的一些問題...對於我的國際象棋應用程序,我有一個比樹更類似於圖的對象圖。所以我決定把數據結構中的各種對象集中在一起,這些數據結構既包含對象物體又包含對象之間的關係。
喜歡的東西:
// in js/app/base/pools.js
var Pool = function() {
this.items = {};
this.relations = {};
};
/**
* store an object into the pool
* and augment it with relation/pooling capabilities
* @param string key
* @param Object obj
*/
Pool.prototype.store = function(key, obj) {
var self = this;
Object.defineProperty(obj.constructor.prototype, "pool", {
set : undefined,
get : function() {
return self;
}
});
this.items[key] = obj;
};
/**
* looks for an object in the pool
* @param string
*/
Pool.prototype.find = function(key) {
return this.items[key];
};
關係被存儲爲成對[OBJ1,OBJ2]在池實例的 「關係」 屬性 。我基本上有兩種關係:
一到一個:一元corespondances像棋子< --->位置,或接口實現像棋子< --->典當| ... |王
一個一對多像板[X1] < ---> [64]瓷磚
這些關係的目的(由池的方式)是雙向的,並且必須設置原子(例如交易),因爲對象交叉引用需要是「ACID」,對於上面的例子,1板包含64塊瓷磚,並且每塊瓷磚知道它的站立板。
對於1:1的關係,也許沒有問題,因爲我可以設置:
chessman.location = location;
// AND AT THE SAME TIME :
location.chessman = chessman;
// with two Object.defineProperty(...) combined
麻煩配備了1-N關係,因爲我能寫:
// 1st : defining relation
// ... (see below)
// 2nd setting a relation
board1.tiles.add(tile_63);
// and
tile_63.board = board1;
// 3rd getting values
board1.tiles --> a collection of tiles (array)
tile_63.board --> board1 object
在關係由傳遞參數對象給予池實例的主程序:
pool.defineRelation("board-contains-tiles", {
tiles : { subject : boards.Board, multiple : true },
board : { subject : tiles.Tile, multiple : false }
});
來定義關係,1面是一個普通的getter/setter,但是N面更像是一個吸氣劑加法器,因爲我們必須填充(板上有瓷磚)...所以這是行不通的:
Pool.prototype.defineRelation = function(alias, definition) {
this.relations[alias] = [];
var self = this, linker;
var relation = self.relations[alias];
var subject, multiple;
// iterate through relation short names
for(name in definition) {
subject = definition[name].subject;
multiple = definition[name].multiple;
console.log("loop with name : " + name + " subject is : " + subject);
var getter = function() {
var result = [];
for(r = 0; r < relation.length; r++) {
// [x,y] storing
if(relation[r][0] == this)
result.push(relation[r][1]);
// [y,x] storing
if(relation[r][1] == this)
result.push(relation[r][0]);
return result;
};
var setter;
if(multiple) {
setter = function() {};
setter.add = function(x) { relation.push([this, x]); };
} else {
setter = function(x) { relation.push([this, x]); };
}
Object.defineProperty(subject.prototype, name, {
set : setter,
get : getter
});
}
};
問題: 我認爲有可能這樣做,但怎麼做?或者更好的方式,像Delphi的TComponent,或者像DOM樹一樣?
也可參見: 老,醜陋和雜亂的代碼庫可以在我的網站上找到:
www.eozine.fr --> Jet d'echecs --> ColorChess
,如果你婉噸至看到以前的結果(2009)
問候。
一種可能的方法來解決:養殖對象(類對象)http://gameprogrammingpatterns.com/type-object.html –
它SA欺騙......我希望這是一個可解決的問題... –