使用舞台实例而不是调用“舞台”的原因?

时间:2011-10-06 14:01:43

标签: actionscript-3

害怕我可能会过度思考这个问题,也不知道我应该使用哪些关键字来查找更多信息。不用说,我的搜索被证明是徒劳的。我想知道是否有理由在AS3课程中,我想做这样的事情:

var myStageInstance:Stage;

//within an arbitrary class
var myStageInstance:Stage = stage;
myStageInstance.addEventListener(MouseEvent, someFunction);

与我通常会做的事情相反:

//within an arbitrary class
stage.addEventListener(MouseEvent, someFunction);

我现在正在寻求解决没有特别的问题。 我想知道是否有理由使用一种方法而不是另一种方法。

3 个答案:

答案 0 :(得分:2)

是的,有理由保留对舞台的参考。一个例子是,如果您要向舞台添加事件侦听器,并且需要确保将来清理它们,或者希望直接控制事件何时进入。这是一个示例:

public class Demo
{
    private var _stage:Stage;

    public function Demo()
    {
        super();
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
    }

    public function destroy():void
    {
        if (_stage)
        {
            _stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            _stage.removeEventListener(Event.MOUSE_LEAVE, onMouseLeave);
            _stage = null;
        }
    }

    private function onAddedToStage(event:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        _stage = stage;

        _stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove, false, 0, true);
        _stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeave, false, 0, true);
    }

    private function onMouseMove(event:MouseEvent):void
    { /* Do something */ }

    private function onMouseLeave(event:Event):void
    { /* Do something */ }
}

答案 1 :(得分:2)

以下代码无法正常工作它会被破坏,因为myStageInstance为null,直到您为其分配内容。

var myStageInstance:Stage;
//within an arbitrary class
myStageInstance.addEventListener(MouseEvent, someFunction);

//You need to do 
var myStageInstance:Stage = stage;
myStageInstance.addEventListener(MouseEvent, someFunction);

//this is more preferred as it is a lot less code. 
stage.addEventListener(MouseEvent, someFunction);

答案 2 :(得分:0)

您的代码不起作用,因为您没有将stageInstance设置为任何内容。

我看不出为什么你会使用除stage以外的任何东西来引用所提供的舞台实例的原因,因为它实际上是一个非全局单例。