2011-10-06 77 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