2012-02-16 97 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来获得点击,然后我就要做的事需要什么。”