AS3里所有能在舞臺(Stage)上看到的東西都繼承自 DisplayObject 。如果讓它最終顯示出來還需要使用某個 DisplayObjectContainer 的addChild() 或者 addChildAt() 方法把它加到顯示列表(display list)里。看看圖示:

顯示列表的最根部是 Stage 。Stage 是一個 DisplayObjectContainer ,所有的可見對象是它的 child 或者 child 的 child 。在一個文檔的第一幀輸入代碼:
trace(stage.getChildAt(0));
輸出類似于“[object Timeline0_94f120f8fa23a64ca3a80eab162a99a]”。下劃線后面的字符串是隨機的,每次都不同。刪掉時間軸上的代碼,綁定文檔到一個自定義類,如 TestStage :
package{
import flash.display.Sprite;? ?
public dynamic class TestStage extends Sprite{
public function TestStage(){
trace(stage.getChildAt(0));
}
}
}
輸出:“[object TestStage]”。可見,Flash IDE 的默認編輯環境,也就是 AS2 里的 _root ,現在是 Stage 的第一個 child 。注意上面的代碼,我把 TestStage 類定義為 dynamic :
public dynamic class TestStage extends Sprite{
AS3 里 DisplayObject 不是動態類,所以如果想像以前那樣使用點語法(mc1.mc2.txt1.text)或者 getChildByName() 方法訪問 Flash IDE 創建的 MC ,必須把類定義為動態,不然會報錯:
“ReferenceError: Error #1056: Cannot create property test_mc on TestStage.”
現在在 Flash IDE 舞臺上隨便創建一個影片剪輯,命名為 test_mc ,修改上面的 trace 代碼為
trace(stage.getChildAt(0).test_mc.name);
輸出:“test_mc”。
在 AS2 里訪問同樣的 MC 代碼為:
trace(_root.test_mc.name);
stage.getChildAt(0) 就是舞臺場景或者我們綁定的文檔類。所以在文檔類里我們直接
trace(this.test_mc.name);
在時間軸上也可以使用同樣的代碼,就像過去一樣。
當然,前面提到,Stage 是一個 DisplayObjectContainer ,所以它有 addChild() 和 addChildAt() 方法。如果使用
//var stage_mc:Sprite = new Sprite();...
stage.addChild(stage_mc) ;
將可以看到在舞臺或者文檔類中創建的所有東西都在這個新加的 stage_mc 之下。如果是
stage.addChildAt(stage_mc,0);
所有的東西將在這個 stage_mc 之上,_root 在這里將相當于 stage.getChildAt(1) 了。這在下面會討論到。
下面用一張圖來加深對 DisplayObjectContainer 的理解,這是一個裝載了不同 DisplayObject 的 DisplayObjectContainer 。

那么究竟有哪些類是 DisplayObjectContainer ?直接繼承 DisplayObjectContainer 的有 Loader, Sprite, Stage 。那么它們和它們所有的子類(Sprite 的子類 MovieClip,DownloadProgressBar 等以及它們的子類)都將是 DisplayObjectContainer ,可以使用 addChild() 和 addChildAt() 方法加載 DisplayObject (DisplayObjectContainer 也繼承 DisplayObject) :
最后來看看 AS3 中的層管理。它是完全自動的。當使用 addChild() 方法把 DisplayObject 加到一個 DisplayObjectContainer 的 display list ,它將自動獲得從0開始的連續的 index 。于是你可以用 getChildAt(0) , getChildAt(1) … 分別獲得第一個、第二個…加入顯示列表(display list)的 DisplayObject ,這比 getChildByName() 方法更有效率。如果使用 addChildAt() 方法把一個 DisplayObject 加到一個已經存在的層,如上面提到的
stage.addChildAt(stage_mc,0);
那么該層原有的以及所有該層之上的內容都自動上移一層(index + 1)。同樣的,當使用 removeChild() 或 removeChildAt() 方法刪除某一層的顯示內容,所有該層之上的內容都會自動下移一層(index - 1)。注意 index 始終是連續的,如果現在的 numChildren 是4,也就是現有最大的 index 是3(0,1,2,3),你將不能 addChildAt(mc,5) 或者任何比5更高的層,編譯器將報錯:
“RangeError: Error #2006: The supplied index is out of bounds.”
最后提一下,所有的 DisplayObject 都有一個 stage 屬性指向 Stage ,使用它的前提是該 DisplayObject 已經加入某個 DisplayObjectContainer 的 display list ,不然返回的將是 null 。