以下技巧均源自實際專案經驗,在 Flex 2 / AS3 環境下驗證可行,涵蓋 JS 互調、記憶體管理、效能優化、型別判斷與轉換、計時器使用、存取控制、迴圈差異、物件特性、工具提示控制、反射機制、時區已知問題、字串替換、深度複製及 mx_internal 命名空間等進階主題。
ExternalInterface.call("jsFunctionName", paramsArray); // 可接收回傳值
// AS 端註冊回呼
ExternalInterface.addCallback("jsCallableName", asFunction);
// JS 端呼叫
swfObjectName.jsCallableName(args);
AS3 採用垃圾回收機制:當物件不再被任何參考指向時,會在不確定時間被回收。因此必須主動清理:
removeEventListener)null否則會造成記憶體長期佔用,導致效能下降。
即使被遮擋的顯示物件,Flash Player 依然會對其進行重繪。例如在同一位置持續繪製數百上千層圓形,滑鼠經過時 CPU 會飆升,但記憶體不會增加。解決方案:將不可見物件的 visible = false 或從顯示清單移除(removeChild)。
| 操作 | 語法 | 說明 |
|---|---|---|
| 判斷型別 | if (obj is MyClass) | 回傳 Boolean |
| 取得型別名稱 | typeof obj | 回傳字串,如 "object", "function", "xml" 等 |
| 安全轉型 | var a:MyClass = b as MyClass; | 轉型失敗回傳 null,不拋出錯誤 |
| 強制轉型 | var a:MyClass = MyClass(b); | 轉型失敗拋出 TypeError |
| 判斷是否為數字 | isNaN(expr) | 是數字回傳 false,非數字回傳 true |
| 修飾字 | 可存取範圍 |
|---|---|
private | 僅限類別本身內部 |
protected | 類別本身及其子類別 |
internal | 同一套件內的所有類別(預設) |
public | 任何地方皆可存取 |
var obj:Object = {name1:"value1", name2:"value2"};
// for...in 取得鍵名
for (var key:String in obj) {
trace(key); // name1, name2
}
// for each...in 取得值
for each (var value:String in obj) {
trace(value); // value1, value2
}
AS3 中所有物件預設可相互轉換,例如陣列可當作 Map 使用(arr["key"] = value),但這樣會失去陣列的順序性保證。
this.truncateToFit = false;updateDisplayList,最後設定 super.toolTip = null;(仍會顯示省略號)var className:String = "com.example.MyClass";
var classType:Class = flash.utils.getDefinitionByName(className) as Class;
var instance:* = new classType();
在中國時區(GMT+8)下,格式化 1970/01/01 08:00 會出錯,確認為 Flex SDK 的時區處理缺陷。
AS3 無 replaceAll,使用正則表達式全域旗標 g:
var testStr:String = "00:00:00";
var result:String = testStr.replace(/:/g, " "); // "00 00 00"
利用 ByteArray 序列化/反序列化實現深層克隆:
private function clone(source:Object):* {
var ba:ByteArray = new ByteArray();
ba.writeObject(source);
ba.position = 0;
return ba.readObject();
}
import mx.core.mx_internal;
use namespace mx_internal;
// 之後即可覆寫標記為 mx_internal 的方法