声明: 本文章转自 Ticore's Blog
DisplayObject 四大變動屬性指的是 stage、parent、root、loaderInfo
這些物件本身的屬性會隨著相對物件變動而變
常常會令人難以捉摸~
依據這些屬性變動行為,DisplayObject 又可以分為三類:
- Stage
- Document Class
- Other DisplayObject
以下則是相關屬性與行為對照表:
Stage | Document Class | Other DisplayObject Class | |
stage | 總是得到 stage | 只要該物件有被加入 stage dom tree 之下, 便可經由 stage 屬性取得 Stage,否則為 null | 只要該物件有被加入 Stage dom tree 之下, 便可經由 stage 屬性取得 stage,否則為 null |
parent | 總是得到 null | 只要該物件有被加入 DisplayObjectContainer 之下, 便可經由 prent 屬性取得 DisplayObjectContainer, 否則為 null | 只要該物件有被加入 DisplayObjectContainer 之下, 便可經由 prent 屬性取得 DisplayObjectContainer, 否則為 null |
root | 總是得到 stage | 總是得到自己本身 | 會得到最接近 parent document class or stage,否則為 null |
loaderInfo | 總是得到不完整功能的實體 | 可以得到實體,但是不會隨著相對物件變動 | 會得到最接近 parent document class or stage loaderInfo,否則為 null |
以上的特性可以很容易被驗證
由於相當繁瑣,僅對 Document Class 與非 Document Class 的 root 變動性作一個示範
main class:
package { import flash.display.*; import flash.net.*; public class main extends MovieClip { var modURL:String = "module.swf"; var ldr:Loader = new Loader(); var req:URLRequest = new URLRequest(modURL); public function main():* { ldr.load(req); this.addChild(ldr); } } }
module class:
package { import flash.display.*; import flash.events.*; public class module extends MovieClip { public function module():* { this.addEventListener(Event.ADDED_TO_STAGE, onAddStage); } public function onAddStage(evtObj:Event):* { this.removeEventListener(Event.ADDED_TO_STAGE, onAddStage); var mc:MovieClip = new MovieClip(); mc.name = "mc"; trace(mc.root); // null this.addChild(mc); trace(mc.root); // [object module] parent.parent.addChild(mc); trace(mc.root); // [object main] trace(this.root); // [object module] parent.parent.addChild(this); trace(this.root); // [object module] } } }