var shot:Function=function():void{
shot['times']++;
trace("shot():times:"+shot['times']);
}
shot['times']=0;
shot();
//為什么里面的shot['times']改為shot.times時就不行了。shot['times']是不是叫用到了數組運算符?
//數組運算符除了在程序運行時需要訪問一個成員,而這個成員的名字到了運行時才會知道的情況下還有哪個情況下需要用?
var shot:Function=function():void{
shot.times++;
trace("shot():times:"+shot.times);
}
shot.times=0;
shot();
為什么是錯的?
//基於內存性能的考慮, as3.0中大部分類都是密封類,不能動態添加屬性的(既然不能動態添加 就當然不能動態訪問了)
比如:
var s:String = "abc";
s.tt = 123; //這里肯定報錯
//場景 1, 圖層'圖層 1', 幀 1,3 行 1119: 訪問可能未定義的屬性 tt (通過 static 類型 String 引用)。
但也有例外,比如MovieClip(影片剪輯) 或者 Object 或者 Function ,根據統計,as3中有幾個類是動態類來的
Error
RegExp
Date
Function
Class
Array
MovieClip
這些都是動態類,可以動態添加屬性
加是可以加了,但加也有一定規則,需要使用數組訪問符來加 和 訪問
亦即是下面說的
數組訪問符有兩種作用
1. 動態設置屬性
2. 動態獲取屬性(相對意義上的動態)
不能使用點語法 . ,要使用數組訪問符 ,但有一個例外,MovieClip是可以直接使用點語法來訪問動態屬性
如:
var d:Date = new Date();
d.a = 1; //報錯
d["a"] = 1; //正常編譯
//其它動態類只能使用數組訪問符
但
var m:MovieClip = new MovieClip();
m.a = 1; //正常編譯m["a"] = 1; //正常編譯
//MovieClip 兩種均可
這個是第一點,動態設置
關於第二點,動態訪問,道理一樣,不能使用點語法,所以要用數組訪問符,
另外一個作用就是批量訪問對象,比如你場景中建了十個影片剪輯 給它們的實例名分別是 mc1 mc2 mc3 ...... mc9 mc10
這種有規律 (mc + 數字)的命名時,如果我想批量為它們添加鼠標事件的話 就可以用數組訪問符
因為你不能用 "mc" + i .addEventListener(MouseEvent.CLICK,onClick_func);
"mc" + i 不是一個對象 ,你要作為對象訪問 必須使用 類似 this["mc" + i] 這樣的語法來獲取對象
至於樓主兩次提到的應用環境,在面向對象編程中,一般不提倡使用動態屬性,
多數時間是習慣了as2.0編程的人,習慣了as2全部動態類,喜歡加啥就加啥 喜歡怎么加就怎么加時使用,一般有了一定編程經驗的as3.0人員一般少用
比如
通過添加一個id的動態屬性 用來在事件處理函數中識別區分點的是哪一個按鈕
一般多數是這樣使用 ,其它使用就是像我上面說的 通過字符組合出的對象名 動態獲取一個對象的引用
下面這段我本來想回復樓主的 但寫着寫着感覺 又長又臭 就不續了 大概意思個就是了
數組訪問符有兩種作用
1. 動態設置屬性
2. 動態獲取屬性(相對意義上的動態)
動態與靜態是相對的概念,在計算機概念上,編譯文件的時候(即按下ctrl+Enter時),編譯器(你不懂的話,先可以理解成flash軟件)會先對源代碼中 聲明的對象 屬性 方法 以及場景中所有對象
(比如一個圖片 它其實是一個bitmap對象 一個影片剪輯 它其實還是一個MovieClip對象 只不過存在於場景中 顯示出來罷了 實際在文件內部它還是識別為一個對象)
編譯器會對這些已經存在的對象作一次點名,並把它們記錄在一個“列表”中(這個列表是 flashPlayer底層自動維護的 我們不用理)
因為這個表已經記錄在案所有編譯階段已經聲明的對象,程序使用它們的時候 ,就可以在這個列表中查找
說到這里 不得不說一下內存空間的事情了
因為不同的數據類型 它們在內存中都有一定的固定字節長度 編譯階段已經聲明的對象 運行時內存空間就已經申請好了
不會頻繁向系統申請內存了 (系統的內存不是你想要就要 它像一個停車場 需要調度才可以騰位置的 太多的空位間隔 就要把車移動騰在一起 以整理出大空地(內存)) 這個騰空間的概念 差不多就是內存整理 ,需要浪費一定的系統資源的
所以說靜態編譯的對象 會相對省系統資源 ,這個也是as3.0中大部分類都默認為密封類(即不能隨便添加動態屬性)的原因了
上面這段是解釋為什么不能用 .屬性 來添加 動態屬性 的原因,as3中大部分對象都是密封類,不能直接使用 .屬性 來添加