2009-10-30 10 views
9

私はよくAS3クラスのコンストラクタ内でinit()を見たことがあり、時にはコンストラクタ内の唯一のコードでもあります。単純にコンストラクタ関数自体を使用してクラスを初期化することができるのであれば、これを行うと便利なのはなぜですか?actionscript 3 init()

package 
{ 

    import flash.display.Sprite; 

    public class Example extends Sprite 
    { 

     public function Example() 
     { 
      init();     
     } 

     public function init ():void 
     { 

     //initialize here 

     } 

    } 

} 

答えて

16

ActionScript 3では、コンストラクタコードは常にコンパイルされずに解釈されます。コードをinit()関数に移動すると、コンパイルと最適化が可能になると思います。

http://blog.pixelbreaker.com/flash/as30-jit-vs-interpreted/

+1

実際には、重要なコードがあれば、コンストラクタによって呼び出される関数に記述してください。 – Allan

+0

私はそれを知りませんでした、興味深いおしゃべりを知って、感謝! – JStriedl

6

私は、私はそれの新しいインスタンスを作成せずにクラスを再初期化することができるようにそれが行われてきた理由。 init()メソッドは基本的には「リセット」ボタンとして機能し、正しいコードを作成すると、クラスを初期状態に戻すことができます。たとえば、設定されたままの変数を許可します。

コード作成の仕方によっては、もちろんです。

3

もう1つの理由は、ステージまたは親コンテナへの参照が必要であり、リスナーをADDED_TO_STAGEリセットするのが面倒だということがあります。次に、クラスをインスタンス化してコンテナに追加し、表示リストに入ったらinit()を呼び出します。

2

AS3に初めて参加したプログラマは、ステージを参照する際に問題が発生することがよくあります(よく知られている「それはありません」という状況です)。これにより

...:

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

private function init(event : Event) : void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE, init); 
    // Reference stage.stageWidth; 
    // Call init after some sort of load completion initialized in the constructor 
} 

...それは簡単に固定です。

また、XMLローダーをコンストラクターで初期化し、ロード完了時にinitialize関数を呼び出すことがあります。