2011-02-22

Initialization blocks in AS3

在 Java 有 Initialization block,在 AS3 也有。以下是在 Flash CS5 的環境下測試。
原始檔為  static_test.fla,Document Class 為 static_test.as。
MySym 為元件,其連結的類別為 MySym.as。
MyClass.as 為非視覺物件的類別。



static_test.as
package {
 import flash.display.MovieClip;
 {
  trace('m1');
 }
 public class static_test extends MovieClip {
  {
   trace('m2');
  };
  public function static_test() {
   trace(this);
  }
  {
   trace('m3');
  }
 }
 {
  trace('m4');
 }
}
MySym.as
package {
 import flash.display.MovieClip;
 import MyClass; // import 並沒有載入類別
 {
  trace('s1');
 }
 public class MySym extends MovieClip {
  {
   trace('s2');
   MyClass + ''; // 為了載入類別
  }
  public function MySym() {
   trace(this);
  }
  {
   trace('s3');
  }
 }
 {
  trace('s4');
 }
}
package  {
 {
  trace('c1');
 }
 public class MyClass {
  {
   trace('c2');
  }
  public function MyClass() {
   trace(this);
  }
  {
   trace('c3');
  }
 }
 {
  trace('c4');
 }
}
結果為:
s2
c2
c3
c1
c4
s3
s1
s4
m2
m3
m1
m4
[object static_test]

由結果可知:
1. Symbol 所連結的類別要比 Document class 先載入。
2. Initialization blocks 寫在相同的類別檔時,屬於類別的先執行,屬於 package 者則較慢執行。
3. Import 無法讓類別載入,只有在使用到該類別時,類別才會被載入。

另外,使用 Flash CS5 時,類別在編譯至 SWF 裡前應該有被 Flash CS5 修改過。使得在 Initialization block 裡宣告的變數無法使用,變通的方式是將變數宣告為類別的 static 變數。

沒有留言:

FB 留言