我試圖做到以下幾點參考:克隆對象和內部功能
var element = {};
element.attrA = 'A';
element.attrB = 1;
element.autoAdvance = function(){
var that = this;
setInterval(function(){
that.attrB++;
},100);
}
element.instance = function(){
var clone = $.extend(true, {}, this);
return clone;
}
現在,我可以做以下就好:
var e1 = element.instance();
var e2 = element.instance();
e1.attrA = 'not e2s business';
e2.attrA = 'not e1s attrA';
,當我嘗試使用autoAdvance
麻煩的開始:
e1.autoAdvance();
將啓動所有克隆的「實例」element
的autoAdvance。我相信這可能是相當微不足道的,但我不知道如何引用我的autoAdvance
函數中的父對象,它的功能正確,並且隻影響實例。謝謝!
編輯:
這是我使用的實際代碼:
var player = {};
player.sprites = {};
player.sprites.back = ['img/playerback_01.png','img/playerback_02.png','img/playerback_03.png'];
player.sprites.head = ['img/playerhead_01.png','img/playerhead_02.png','img/playerhead_03.png'];
player.back = new Image();
player.back.src = player.sprites.back[0];
player.head = new Image();
player.head.src = player.sprites.head[0];
player.loop = function(){
var that = this;
var loop = setInterval(function(){
//remove the [0] state from the sprite array and add it at [2]
var state = that.sprites.head.shift();
that.sprites.head.push(state);
state = that.sprites.back.shift();
that.sprites.back.push(state);
that.back.src = that.sprites.back[0];
that.head.src = that.sprites.head[0];
}, 100);
}
player.x = 0;
player.y = 0;
player.instance = function(){
var clone = $.extend(true, {}, this);
return clone;
}
我產生兩名球員:
var player1 = player.instance();
var player2 = player.instance();
但正在發生的事情是,當我使用:
player1.loop();
player2
的動畫也將開始播放。
看起來不錯。證明:http://jsfiddle.net/Q45ft/這個指的是什麼取決於函數的調用方式。當你將它稱爲'e1.autoAdvance()'時,'this'將引用'autoAdvance'中的'e1',並且不會影響任何其他對象。 – 2012-02-14 12:24:28
嗯,我的'實際'代碼稍微複雜一些,但我會將其添加到問題中。 – m90 2012-02-14 12:27:20
我假定''.extend'不知道如何克隆'back'和'head'對象(因爲它們是'Image's,擴展只能和數組和對象一起工作([source](https:// github.com/jquery/jquery/blob/master/src/core.js#L303)))。我只是使用一個構造函數並使用該函數創建實例。 – 2012-02-14 12:35:55