【问题标题】:Cloned objects and reference inside functions克隆对象和函数内部引用
【发布时间】: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/Q45ftthis指的是什么,取决于函数的调用方式。正如你所说的e1.autoAdvance()this 将在autoAdvance 中引用e1,并且不会影响任何其他对象。
  • 嗯,我的“实际”代码有点复杂,但我会将其添加到问题中。
  • 我假设$.extend 不知道如何克隆backhead 对象(因为它们是Images,extend 仅适用于数组和对象(source ))。我只会使用构造函数并使用该构造函数创建实例。
  • 好的,这个:stackoverflow.com/questions/122102/… 让我认为它会深度克隆对象。关于深度克隆的任何提示?
  • 我错了,看我编辑的评论。

标签: javascript jquery object


【解决方案1】:

我建议你开始在 JavaScript 中使用“类”。它们或多或少是一种功能。

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

它并不能真正回答您的问题,但它是一种以更清洁、更好的方式编写代码的替代方法。

【讨论】:

  • 今天刚刚看到你的答案,因为 Felix 已经在我的问题的 cmets 中提出了这个建议。这正是我最终的结果。感谢您的提示。
猜你喜欢
  • 2021-06-30
  • 2012-08-29
  • 1970-01-01
  • 2015-02-19
  • 2011-08-25
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多