2012-02-14 43 views
4

我試圖做到以下幾點參考:克隆對象和內部功能

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的動畫也將開始播放。

+0

看起來不錯。證明:http://jsfiddle.net/Q45ft/這個指的是什麼取決於函數的調用方式。當你將它稱爲'e1.autoAdvance()'時,'this'將引用'autoAdvance'中的'e1',並且不會影響任何其他對象。 – 2012-02-14 12:24:28

+0

嗯,我的'實際'代碼稍微複雜一些,但我會將其添加到問題中。 – m90 2012-02-14 12:27:20

+1

我假定''.extend'不知道如何克隆'back'和'head'對象(因爲它們是'Image's,擴展只能和數組和對象一起工作([source](https:// github.com/jquery/jquery/blob/master/src/core.js#L303)))。我只是使用一個構造函數並使用該函數創建實例。 – 2012-02-14 12:35:55

回答

0

我建議你在JavaScript中開始使用「class」。它們或多或少是一種功能。

function Player(){ 
this.sprites={}; 
...... 
} 
Player.prototype.loop=function(){ 
.... 
} 
var player1=new Player(); 
var player2=new Player(); 
player1.loop(); 
player2.loop();// this should work better 

它並沒有真正回答你的問題,但它是一種更清潔和更好的方式編寫代碼的替代方法。

+0

剛剛看到你的答案,因爲費利克斯已經在我的問題的評論中提出了這個建議。這正是我最終的結果。感謝提示。 – m90 2012-02-20 10:24:25