【问题标题】:Actionscript - how to pass object by value?Actionscript - 如何按值传递对象?
【发布时间】:2013-04-20 14:32:20
【问题描述】:

我想将一个对象按值传递给一个函数,以便我可以对该对象进行修改。我不希望更新原始对象。但是,所有函数参数都是通过引用传递的。

我试图复制一个对象 (var new_object:Object = original_object;) 这只是创建了一个指向original_object 的指针。

有没有办法按值传递参数?

update 我看到的一种解决方法是使用ByteArray 作为described here 来制作对象的深层副本。不确定它的效率如何。也许有更好的解决方案。

【问题讨论】:

  • 下面的答案是正确的,因为您必须克隆对象才能不修改原始对象的字段。但是,您的问题不是:在 ActionScript 中,对象总是按值传递,而不是按引用传递。值 您传入的对象,而不是指向其容器的指针。您可以轻松地验证这一点:如果在您的函数中的任何时候,您将不同的对象分配给 original_object,它将指向新实例,但原始变量仍指向原始对象。

标签: actionscript-3 actionscript


【解决方案1】:

在将对象传递给函数之前,您必须对其进行复制:

public function copy(value:Object):Object
{
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(value);
    buffer.position = 0;
    var result:Object = buffer.readObject();
    return result;
}

public function testFunction(obj:Object):void
{  
   //do something with obj
}

public function test():void
{
  var obj:Object = {};
  testFunction(copy(obj));
}

【讨论】:

  • 查看copyclone这里的方法:opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/…我使用的copy基本上是从那里来的。
  • 您也可以在 testFunction() 中进行复制。这只会让你的代码在你调用 testFunction 的地方更容易阅读。
  • @BarışUşaklı - 我有点困惑。为什么我不能使用来自mx.utils.ObjectUtil 的复制/克隆方法?此外,当我尝试包含该对​​象时,我在 mx.utils 包中看不到它。那是因为我需要以某种方式手动包含一个库吗?
  • @dev.e.loper 如果您使用的是 Flex,那么您可以使用这些功能,如果不是,您可以复制源代码并将其添加到您的项目中。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2018-07-11
  • 1970-01-01
  • 2015-06-12
  • 2016-07-29
相关资源
最近更新 更多