Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何在ActionScript中通过引用传递?_Actionscript 3_Oop_Pass By Reference - Fatal编程技术网

Actionscript 3 如何在ActionScript中通过引用传递?

Actionscript 3 如何在ActionScript中通过引用传递?,actionscript-3,oop,pass-by-reference,Actionscript 3,Oop,Pass By Reference,我正在尝试修改另一个类中的对象。所以我有这样的想法: MainClass.as: 类别2.as 因此,JSON操作在Class2中正确执行,它将.parse()值分配给对象,但我认为AS的pass-by-reference逻辑有一些我不理解的地方。因为我在MainClass.as中期望myObject 我应该如何直接修改函数参数(myObject)的值 谢谢 问题在事件处理程序的这一行中: the_object = JSON.parse(loader.data); 执行此操作的那一刻,您就不再

我正在尝试修改另一个类中的
对象。所以我有这样的想法:

MainClass.as:

类别2.as

因此,JSON操作在Class2中正确执行,它将
.parse()
值分配给
对象
,但我认为AS的pass-by-reference逻辑有一些我不理解的地方。因为我在MainClass.as中期望
myObject

我应该如何直接修改函数参数(myObject)的值


谢谢

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

the_object = JSON.parse(loader.data);
执行此操作的那一刻,您就不再处理传递给该方法的对象。您正在为名为
的局部变量分配一个新值,该变量是\u对象
。理解对象不是通过引用传递很重要-对象引用是通过值传递的。因此,方法中的\u对象是引用的副本。指定新值时,该副本将被其他引用覆盖

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


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

对象通过引用传递

但正如我在代码中看到的那样,您正在用另一个对象覆盖
这个\u对象
这个\u对象=JSON.parse(loader.data)

您可以创建一个新变量,然后复制\u对象中的值:

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

默认情况下,对象是通过引用传递的。_对象不是myObject。在Class2\u方法中创建\u对象后,请尝试返回该对象。您可能会发现,从长远来看,使用另一种设计比使用静态方法更好。@AmyBlankenship谢谢,今天我在从CompleteHandler返回时遇到了一些困难(因为他们等待URL请求完成,“异步”是我猜的术语),所以我试图找到一种不返回的方法。你说的非静态方法是什么意思?我想我应该编辑我的问题来添加实际的代码。我真的很困惑。如果_对象不是myObject,那么它如何“通过引用传递”?在Adobe.com手册中,它说myObject的值会改变,但它不会改变,而且我不能从CompleteHandler返回。那么我如何保存JSON数组呢?因为调用JSON.parse时会创建一个新对象。所以你通过了这个主题,然后重写了。谢谢!是的,我现在发现了一个非常类似的解决方案。但我习惯于像问题中的C#那样做,这也是通过引用传递的。它不应该保持我覆盖它的方式吗?我的意思是,显然,对象的属性是通过引用传递的,而不是对象本身。为什么?因为现在它是一个完全不同的物体。调用代码中仍引用旧对象。注意上面的代码是如何将JSON.parse创建的新对象中的所有proerties复制到现有的object.Wow上的。这就解释了我的问题。非常感谢你,马特!不幸的是,我无法从这个函数返回,因为它是异步运行的,但我会记住“双重引用”这一点。谢谢啊,在异步场景中,你可以考虑返回一个“允诺”类型。再次,我不确定ActionScript是否支持这个。它不是被传递的对象的值,而是对对象的引用。所期望的@void是对引用的引用;)@MattDavey在ActionScript中,您可以通过返回一个“包装器”对象来处理此问题,该对象起初不包含任何内容,但稍后将包含真实对象,并在准备好时发送事件。使用集合时,您可以传回一个空集合,并在内容出现时使用结果填充内容。如果不使用Flex,则必须扩展集合,以便能够在需要时分派事件。
the_object = JSON.parse(loader.data);
var json:Object = JSON.parse(loader.data);
for (var k:String in json) {
 the_object[k]=json[k];
}