【问题标题】:ActionScript operator asActionScript 运算符为
【发布时间】:2025-12-21 22:15:17
【问题描述】:

有人对as 运算符有很好的解释吗?

在我看来,一方面,通常使用 as 比实例化一个新对象更好。

但是在某些情况下,这个运算符让我失望了。例如,当通过URLLoader 加载 XML 格式的文本文件时:

private function completeHandler(event:Event):void {
    var loader:URLLoader = URLLoader(event.target);
    trace("completeHandler: " + loader.data);

    var x:XML = new XML(loader.data);
    trace("x=" + x);
}

为什么我必须在这里使用构造函数?为什么我不能说 var x:XML = loader.data as XML; 并节省一些内存?

感谢您的任何见解! 亚历克斯

【问题讨论】:

  • 尝试使用 var x:XML = new XML(loader.data);
  • 是的,谢谢,这是我的问题中的一个错字。

标签: actionscript-3 actionscript urlloader


【解决方案1】:

as 评估变量的类型是另一个类的超类还是子类。它不会创建新对象。与is 的区别在于is 返回布尔值,as 返回所需类型的对象或null。它用于类型转换。

请参阅ActionScript documentation

一个典型的用例是在舞台上使用一个 MovieClip,它是通过实例名称检索的:

// This will not compile:
var d:DisplayObject = stage.getChildByName ("instance1"); 
d.gotoAndPlay (2);

// This will play the MovieClip from frame 2
var m : MovieClip = stage.getChildByName ("instance1") as MovieClip;
m.gotoAndPlay (2); 

stage.getChildByName() 总是返回一个 DisplayObject,不管它是否真的是一个 MovieClip、Sprite、Button 等。所以如果你想使用任何类 MovieClip 的方法,你需要先将类型转换为 MovieClip。但是,这不会创建新的 MovieClip,而只是确保您使用的是正确的类型。

【讨论】:

  • +1 另外@Alexander Farber 您可以使用以下符号进行转换。 var m : MovieClip = MovieClip(stage.getChildByName ("instance1"));这里的区别是如果转换不成功,将抛出运行时错误。相比之下,as 运算符将返回 null。
  • 谢谢。关于为什么在我的示例中得到 null 的任何解释: var x:XML = loader.data as XML; ?
  • 当然,loader.data 不是 XML 对象(即使它包含 xml 文本)。如果您编写 XML(loader.data),您将使用*运算符 XML(),它获取文本并从中创建 XML 对象。