2013-04-20 112 views
1

我想通过值传递一个对象到一个函数,以便我可以对该对象进行修改。我不想要更新原始对象。但是,所有的函数参数都是通过引用传递的。Actionscript - 如何通过值传递对象?

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

有没有一种方法可以通过值传递参数?

更新我看到的一种解决方法是使用ByteArray作为described here来制作对象的深层副本。不知道它有多高效。也许有更好的解决方案。

+0

下面的答案是在正确的,你必须克隆不修改原始对象的字段的对象。但是,您的问题不是:在ActionScript中,对象总是*按值传递,而不是通过引用传递。值*是您传入的对象,而不是指向其容器的指针。您可以很容易地验证这一点:如果在函数中的任何时候,您将一个不同的对象分配给'original_object',它将指向新实例,但原始变量仍指向原始对象。 – weltraumpirat 2013-04-20 15:18:09

回答

5

你将它传递给函数之前,使对象的副本:

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)); 
} 
+0

刚刚更新了我的帖子,没有及时看到你的帖子。 – 2013-04-20 14:38:29

+3

在这里查看'copy'和'clone'的方法:http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/projects/framework/src/mx/utils/ObjectUtil.as我用的'copy'基本上就是从那里开始的。 – 2013-04-20 14:39:49

+0

你也可以在testFunction()里做副本。这只是让你的代码更容易阅读,无论你打电话给testFunction。 – prototypical 2013-04-20 15:26:12