我正在尝试修改另一个班级中的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的传递引用逻辑有一些我不理解的东西。因为我期望MainClass中的myObject
也会改变。
我该怎么做才能直接修改函数参数(myObject)的值?
谢谢!
答案 0 :(得分:5)
问题出在您的事件处理程序的这一行:
the_object = JSON.parse(loader.data);
您执行此操作的那一刻,您将不再处理传入方法的对象。您正在为名为the_object
的局部变量分配新值。重要的是要理解对象不是通过引用传递的 - 对象引用按值传递。因此,您方法中的the_object
是参考的副本。分配新值时,将使用其他引用覆盖该副本。
解决方案是通过引用传递引用 - 这与C ++等语言中的双指针概念有关,也称为双间接。我不确定这在ActionScript中是否可行。
更好的解决方案,只需将反序列化对象作为返回值返回。
答案 1 :(得分: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];
}