【问题标题】:How to assign values to objects through a variable that is just a reference to them?如何通过只是对它们的引用的变量为对象赋值?
【发布时间】:2012-07-15 18:30:00
【问题描述】:

这个问题我实在是太含糊了,但我想你会明白的……

我正在用 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!

这在location 只是scene.internals.draw 时运行良好,因为它直接更改了数组。但是现在,我将新值分配给本地 location 变量,而不是所需的 scene.internals.draw 一个!

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

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

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

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

【问题讨论】:

  • 您可以将 location 重写为处理 get 和 set 的函数。 location() 将获取,并且 location(arr) 将设置。不确定您是否可以使用 = 符号
  • 不确定你的意思,@CoryDanielson。
  • 我在想这样的事情:jsfiddle.net/s2QQK/1 但 Esailija 的回答非常好。这个 getter/setter 有点麻烦

标签: javascript arrays oop object methods


【解决方案1】:

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

【讨论】:

  • 非常感谢,我会用这个,但是.apply方法不是需要一个数组作为第二个参数吗?你不应该改用.call 吗?另外,您为什么要首先使用这些功能更改上下文?
  • 啊哈!我现在明白了! buff.conc... 产生一个数组...现在一切都清楚了,谢谢。
  • @Bane .apply 的第一个参数是上下文,第二个 an 是一个数组,它将作为函数的参数。 buff1.concat(buff2) 将是 .push 的参数数组,作用于 .location
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-09
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多