2

我正在尝试修改Object另一个类中的一个。所以我有这样的事情:

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 的传递引用逻辑有些我不理解。因为我期待myObjectMainClass.as 也会改变。

我应该怎么做才能直接修改函数参数(myObject)的值?

谢谢 !

4

2 回答 2

5

问题出在事件处理程序的这一行中:

the_object = JSON.parse(loader.data);

执行此操作的那一刻,您将不再处理传递给该方法的对象。您正在为名为 的局部变量分配一个新值the_object。重要的是要了解对象不是通过引用传递的——对象引用是通过值传递的。所以the_object在你的方法中是引用的副本。当您分配一个新值时,该副本将被不同的引用覆盖。

解决方案是通过引用传递引用——这与C++等语言中双指针的概念有关,也称为双间接。我不确定这在 ActionScript 中是否可行。

更好的解决方案,只需将反序列化的对象作为返回值返回。

于 2013-05-08T15:15:46.127 回答
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];
}
于 2013-05-08T15:17:52.170 回答