Actionscript 3 AS3从另一个类访问主类内的方法。给出错误?
我在使用actionScript时遇到了麻烦,我试图使用一个简单的单行代码来访问Document类(Main)中的一个方法,但每次我都会出错。我在舞台上用movieClip尝试了同样的代码,效果很好 链接到fla的主类: Leecher类:Actionscript 3 AS3从另一个类访问主类内的方法。给出错误?,actionscript-3,Actionscript 3,我在使用actionScript时遇到了麻烦,我试图使用一个简单的单行代码来访问Document类(Main)中的一个方法,但每次我都会出错。我在舞台上用movieClip尝试了同样的代码,效果很好 链接到fla的主类: Leecher类: package { import flash.display.*; public class Leecher extends MovieClip { public function leech():void
package {
import flash.display.*;
public class Leecher extends MovieClip {
public function leech():void
{
trace(" leech function ");
Main(parent).callMe(); // output null object
Main(root).callMe(); // output null object
Main(Main).callMe(); // output null object
}
}
}
package
{
import flash.display.*;
import flash.events.*;
public class Button extends MovieClip {
public function Button() {
this.addEventListener(MouseEvent.CLICK,r_click);
}
private function r_click(e:MouseEvent):void {
var l:Leecher = new Leecher();
l.leech();
Main(parent).callMe(); // hey nice work
Main(root).callMe(); // hey nice work
Main(Main).callMe(); // output null object
}
}
}
相同的代码,但类链接到舞台上的按钮
package {
import flash.display.*;
public class Leecher extends MovieClip {
public function leech():void
{
trace(" leech function ");
Main(parent).callMe(); // output null object
Main(root).callMe(); // output null object
Main(Main).callMe(); // output null object
}
}
}
package
{
import flash.display.*;
import flash.events.*;
public class Button extends MovieClip {
public function Button() {
this.addEventListener(MouseEvent.CLICK,r_click);
}
private function r_click(e:MouseEvent):void {
var l:Leecher = new Leecher();
l.leech();
Main(parent).callMe(); // hey nice work
Main(root).callMe(); // hey nice work
Main(Main).callMe(); // output null object
}
}
}
错误是因为当该代码运行时,
Leecher
实例尚未添加到显示列表中,因此没有parent
或root
或stage
(因此parent
为null
)
下面是正在发生的事情的分类(用代码注释解释):
显示对象的根
,父
和阶段
变量仅在所述显示对象添加到显示列表时填充。在root
和stage
的情况下,还必须添加父母(以及任何祖父母),以便最顶端的父母/祖父母是stage
因此,您需要等待,直到可以安全地通过侦听事件访问父级
private function _click(e:MouseEvent):void {
var l:Leecher = new Leecher();
//call the leech method once the child has been added to the stage and has a parent value
l.addEventListener(Event.ADDED_TO_STAGE, l.leech, false, 0, true);
addChild(l);
}
如果执行上述操作,则需要向leech方法添加可选的事件参数,否则会出现错误:
public function leech(e:Event = null):void
{
为了使主类易于访问,可以使用静态引用。
静态变量不绑定到对象的实例,而是绑定到类本身
public class Main extends MovieClip {
//create a static var that holds a reference to the root/main instance
public static var main:Main;
public function Main() {
//assign the static var to this (the instance of Main)
main = this;
//...rest of code
如果这样做,您可以通过执行Main.Main
来评估代码中任何地方的根,因此在您的示例中,您可以执行以下操作:
Main.main.callMe();
我建议在疯狂使用静态变量之前,多读一些关于静态变量的书。执行我刚才为方便引用文档类/根而展示的操作是安全的,但在其他上下文中,最好注意一些内存和性能方面的细微差别。DisplayObject.parent和DisplayObject.root仅在相关的DisplayObject附加到stage的显示列表时才定义。按钮实例是附加的,因此可以工作,Leecher实例没有附加到任何东西,其父实例和根实例都为null。然后,Main(anything)是一个类型转换,类本身不是实例,所以Main(Main)总是会给出null代码>为我修复错误,敬请谅解