2

我无法真正含糊地表达这个问题,但我想你会明白......

我正在用 Javascript 开发一个游戏引擎,该Scene对象是许多东西的容器,它有一个方法应该改变其中的一个数组,特别是一个包含所有可以绘制的东西的数组。

该数组的访问方式如下:

scene.internals.draw

问题是,它在方法中被多次引用,我认为名称/路径可能会改变。自然,我不想每次更改数组的路径时都更改方法中对它的每个引用,所以我这样做了:

var location = scene.internals.draw;

现在,实际的方法代码和算法可以保持不变,如果场景中数组的名称/路径发生变化,我只需要更改那一行。

它在大多数情况下运行良好。我可以.push(obj)这样做,等等,但是在某一时刻,我需要“剖析”数组,即将它分成两半,添加一些东西,然后将其放回原处,如下所示:

buff1 = location.slice(0, i); //First slice of the array.
buff2 = location.slice(i, location.length); //Second slice of the array.

//Add something in between those slices.
buff1.push(ob);
location = buff1.concat(buff2); //Problems here!

这在locationjust时效果很好scene.internals.draw,因为它直接更改了数组。但是现在,我将新值分配给局部location变量,而不是所需的值scene.internals.draw

问题:如何使用 = 运算符将值分配给“真实”对象,而不是包含对这些对象的引用的变量(如location)?

显而易见的解决方案是,在方法结束时:

scene.internals.draw = location.slice();

没关系,唯一的副作用是我将不得不写两次原始名称,并编辑两次,这不是什么大问题。但是,我可能会发现自己处于其他可能需要该功能的情况,所以我仍然想要一个答案。

4

2 回答 2

2

javascript 中没有引用赋值,所以你不能这样做。您所做的通常被误认为是通过引用分配,但实际上它是具有类似含义的引用值的副本。

自从你这样做以来,你可能在某个地方遇到了更深层次的问题,但我不想进入那个。

你可以这样做:

location.splice( 0, location.length ); //Remove all items in the array
location.push.apply( location, buff1.concat(buff2) ); //Push the buffers into the array
于 2012-07-16T21:03:14.043 回答
2

用你的术语来说,Javascript 中没有“真正的”对象——只有对象和持有对它们的引用的变量。

当您分配给location您时,您只是在创建对对象的附加引用。系统不知道它是哪个“真实”对象,也不知道可能持有对它的引用的任何其他变量。

因此,当您重新分配location您时,您只是覆盖了该特定参考。对该对象的任何其他原始引用将保持指向它们所在的位置。

于 2012-07-16T21:06:12.990 回答