2011-10-06 49 views
0

害怕我可能会过度思考这一点,也不知道我应该使用哪些关键字来查找更多信息。不用说我的搜索是徒劳的。我想知道如果存在,一个AS3类中,我也想这样做的理由:使用舞台实例而不是调用“舞台”的原因是什么?

var myStageInstance:Stage; 

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

,而不是东西,我通常会做:

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

目前我没有特别的问题要解决。 我只想知道是否有理由使用另一种方法。

回答

2

后续代码将不工作它是因为myStageInstance为空,直到你指定它为止。

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); 
+0

谢谢,对不起,忽略了舞台布置 - 我会更新这个问题。我只指定了类型。不过,了解这两种方法之间的功能差异会很好。从逻辑上讲,我明白使用'舞台'简直就是更简单和更清洁的开箱即用。 – Structure

+0

2之间的唯一真正区别是一个是全局变量(stage),另一个是局部变量var(myStageInstance),但是因为对象通过引用传递,所以2之间确实没有区别。 –

+0

充其量只有我能想到的是如果你想延长舞台课程。然而,我甚至不确定这是否可能,它可能是最后一堂课,可能是。 –

0

你的代码不应该工作,因为你没有设置stageInstance任何东西。

我看不到你之所以会用stage以外的任何东西来引用所提供的阶段实例,因为它实际上是一个非全局单例。

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 */ } 
} 
+0

因此,在您的情况下,而不必跟踪舞台监听器,您现在需要跟踪Demo实例。似乎仍然毫无意义。 –

+0

我认为检查_stage为null比检查willTrigger/hasEventListner更高效。另外,这些函数会找到其他类添加的监听器,这可能不是您想要的。 –

+0

就像我说过的,当我想维护自己的参考时,我会这样做。我发现它非常有用,并且比依靠显示列表管理我的引用更容易调试。在Flash Builder IDE中的断点内部工作时,深入展示列表是一种痛苦。用一个硬变量引用,值就在那里。我知道这似乎比必要的“实际操作”要多一点,但我发现它在很多项目的过程中都非常有帮助。 有可能是一个速度的好处,但它不是我选择在这些情况下保留我自己的引用的理由。 – meddlingwithfire