【发布时间】:2012-02-14 12:19:57
【问题描述】:
我正在尝试执行以下操作:
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-function 中引用父对象,以使其被正确克隆并且只影响实例。谢谢!
编辑:
这是我正在使用的实际代码:
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 的动画也将开始播放。
【问题讨论】:
-
对我来说看起来不错。证明:jsfiddle.net/Q45ft
this指的是什么,取决于函数的调用方式。正如你所说的e1.autoAdvance(),this将在autoAdvance中引用e1,并且不会影响任何其他对象。 -
嗯,我的“实际”代码有点复杂,但我会将其添加到问题中。
-
我假设
$.extend不知道如何克隆back和head对象(因为它们是Images,extend 仅适用于数组和对象(source ))。我只会使用构造函数并使用该构造函数创建实例。 -
好的,这个:stackoverflow.com/questions/122102/… 让我认为它会深度克隆对象。关于深度克隆的任何提示?
-
我错了,看我编辑的评论。
标签: javascript jquery object