什么是"if(stage)init();" 在ActionScript中意味着什么?

use*_*291 5 flash actionscript-3

我正在用FlashDevelop创建我的第一个AS3,我不明白构造函数中指令的含义:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

什么if (stage) init();意思?什么是Event.ADDED_TO_STAGE?为什么删除监听器init()

小智 9

主类通常是一个文档类 - >作为第一个被放到舞台(显示树的根)的类.这意味着在构造函数(Main函数)中您已经可以访问stage.

if(stage) init();
Run Code Online (Sandbox Code Playgroud)

实际上意味着如果stage!= null,则运行初始化.

为什么在文档类中测试null?
如果你的swf被包裹到另一个瑞士法郎.您的主要功能将无法访问舞台,因为只有显示树(舞台上)上的精灵(电影剪辑等)才能访问舞台.
像这样:

var mc:MovieClip = new MovieClip();//mc.stage == null
stage.addChild(mc);//mc.stage != null
Run Code Online (Sandbox Code Playgroud)

因此,通过向ADDED_TO_STAGE添加一个侦听器,您将等待直到您实际访问stage,然后初始化它.您可以立即删除侦听器,因为您不再需要它.

这是文档(主)类中的常见情况,因为您需要阶段来添加菜单,介绍,无论是什么阶段,所以它是可见的.