2012-02-16 63 views
0

當添加事件偵聽器,並確定其相應的功能,我發現自己定義在構造函數中大量的代碼的功能。像這樣:AS3 - 其他函數中定義函數

package 
    { 
     public class stuff extends Sprite 
     { 
      public function stuff() 
      { 
       minimizeBtn.addEventListener(MouseEvent.CLICK, minimizeOnClick); 
       function minimizeOnClick(e:MouseEvent):void 
       { 
         //do minimization stuff here 
       } 
      } 
     } 
    } 

但是,顯然有另一個選擇來定義它,就像類的任何其他方法。事情是這樣的:

package 
    { 
     public class stuff extends Sprite 
     { 
      public function stuff() 
      { 
       minimizeBtn.addEventListener(MouseEvent.CLICK, minimizeOnClick); 
      } 

      internal function minimizeOnClick(e:MouseEvent):void 
      { 
       //do minimization stuff here 
      } 
     } 
    } 

第二個選項可能無法真正意義,因爲該功能並不是真正的類的方法。但我擔心的是,第一種方法會爲每個類的實例使用額外的內存。哪種做法最有效且正確?第一種方法是否爲類的每個實例佔用額外的內存或CPU時間?

謝謝!

+0

理想情況下,你會希望有構造儘可能簡單(如果你需要做很多事情調用一個init()定義的私有方法)並具有監聽器(minimizeOnClick)作爲私有函數是最簡單的解決方案在我看來 – 2012-02-16 23:47:49

+0

謝謝喬治。我見過其他人說保持構造簡單。除了代碼可讀性之外,還有其他原因嗎?使用init函數只會增加更多的開銷(只有幾個CPU週期,所以它幾乎沒有,但仍然)。 AS中的構造函數是否與C或Java構造函數完全不同? – 2012-02-16 23:53:32

+0

根據[JOA埃伯特](http://blog.joa-ebert.com/)的ActionScript 3個的優化技術(http://je2050.joa-ebert.com/files/misc/as3opt.pdf)「構造函數中的代碼沒有被即時編譯器(JIT)優化,要使用JIT優化代碼,可以從構造函數中調用函數,然後再次優化函數中的代碼。「簡而言之,Actionscript虛擬機(AVM)的工作方式與C/Java不同。 – 2012-02-16 23:58:59

回答

1

後者的例子是正確的道路,這是真的,你應該嘗試的相關類中封裝你addEventListener()和監聽功能。在你的情況,你可能要考慮制定一個類你minimizeBtn

public class MinimizeButton extends SimpleButton 
{ 

    public function MinimizeButton() 
    { 
     addEventListener(MouseEvent.CLICK, _onClick); 
    } 

    private function _onClick(e:MouseEvent):void 
    { 
     // do minimization stuff here 
    } 

} 

MinimizeButton_onClick()應該再爲類stuff的相關實例,並運行任何stuff需要從那裏做。

這個例子的過程更像是:

MinimizeButton:「我被點擊,我應該告訴stuff所以它可以做相關的事情。」

不是:

stuff:「我要坐等MinimizeButton來獲得點擊,然後我就要做的事需要什麼。」