2013-04-20 172 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