2013-05-08 36 views
1

我試圖修改另一個類中的Object。所以,我有這樣的事情:如何在ActionScript中通過引用傳遞?

MainClass.as

.. 
var myObject:Object = new Object(); 
Class2_Instance.get_JSON(myObject); 
trace(myObject.id); // output: undefined. whereas it should be 42. see below. 
.. 

Class2.as

public function get_JSON(url:String , the_object:Object) 
{ 
    var request:URLRequest = new URLRequest(url); 
    var variables:URLLoader = new URLLoader(); 
    variables.dataFormat = URLLoaderDataFormat.TEXT; 
    variables.addEventListener(Event.COMPLETE, Complete_Handler_JSON(the_object)); 
    try 
    { 
     variables.load(request); 
    } 
    catch (error:Error) 
    { 
     trace("Unable to load URL: " + error); 
    } 
} 

function Complete_Handler_JSON(the_object:Object):Function 
{ 
    return function(event:Event):void 
    { 
    var loader:URLLoader = URLLoader(event.target); 
    the_object = JSON.parse(loader.data);  
    trace(the_object.id); //returns 42. 
    }; 
} 

所以JSON操作中的Class2正確執行,並將其分配的.parse()值爲the_object,但我認爲有些東西我不明白與AS的傳遞參考邏輯。因爲我期待MainClass中的myObject也會改變。

我應該怎麼做直接修改函數參數(myObject)的值?

謝謝!

+0

對象由默認的引用傳遞。 the_object不是myObject。在Class2_Method中創建它之後嘗試返回the_object。你可能會發現,從長遠來看,你最好採用另一種設計而不是靜態方法。 – 2013-05-08 14:32:00

+0

@AmyBlankenship謝謝,今天我在從CompleteHandler返回時遇到了一些困難(因爲他們等待URLRequest完成,「異步」是我猜測的術語),所以我試圖找到一種沒有返回的方式。你是什​​麼意思的非靜態方法?我想我應該編輯我的問題來添加實際的代碼。 – void 2013-05-08 14:33:56

+0

我真的很困惑。如果the_object不是myObject,那麼它是如何「通過引用」?在Adobe.com手冊中,它說myObject的價值會改變,但它不會:/我不能從CompleteHandler返回。那麼我將如何保存JSON數組? – void 2013-05-08 15:00:01

回答

2

Objects通過參考傳遞。

但正如我在您的代碼中看到的,您正在覆蓋the_object另一個線上:the_object=JSON.parse(loader.data)

您可以創建一個新的變量,然後複製the_object值:

var json:Object = JSON.parse(loader.data); 
for (var k:String in json) { 
the_object[k]=json[k]; 
} 
+0

謝謝!是的,我現在找到了一個與此非常相似的解決方案。但我習慣像C#中的問題那樣做,這也是通過引用的方式。它不應該仍然是我覆蓋它的方式嗎?我的意思是,顯然對象的屬性是通過引用傳遞的,而不是對象本身。爲什麼? – void 2013-05-08 15:24:05

+1

因爲現在它是一個完全不同的對象。舊對象仍然在調用代碼中引用。請注意上面的代碼如何將JSON.parse創建的* new *對象的所有屬性複製到現有對象上。 – 2013-05-08 15:47:16

5

的問題是在這條線在你的事件處理程序:

the_object = JSON.parse(loader.data); 

這樣做的那一刻,你就不再處理您傳遞給方法的對象。您正在爲名爲the_object的本地變量分配一個新值。瞭解對象未通過引用傳遞很重要 - 對象引用通過值傳遞。所以the_object你的方法是副本參考。當您分配新值時,該副本將被另一個參考覆蓋。

解決方法是通過引用傳遞引用 - 這與C++等語言中的雙指針的概念有關,也稱爲雙重間接。我不確定這在ActionScript中甚至是可能的。

更好的解決方案,只需返回反序列化的對象作爲返回值。

+0

哇。這解釋了我的問題。非常感謝你馬特!不幸的是我不能從這個函數返回,因爲它是異步運行的,但我會記住這個「雙引用」的東西。謝謝 ! – void 2013-05-08 15:26:12

+0

啊,在異步場景中,你可能會考慮返回一個「承諾」類型> http://en.wikipedia.org/wiki/Futures_and_promises再次我不確定ActionScript是否支持這個。 – MattDavey 2013-05-08 15:27:45

+0

這不是傳遞的對象的值,而是對該對象的引用。什麼是希望@void是對引用的引用;) – Patrick 2013-05-08 15:31:28