2011年7月16日 星期六

動態產生函數運算式及以Delete刪除

※ 動態建立函數運算式,以trace()觀察this在函數運算式內部與外部的不同
※ 對於繫結方法,this 關鍵字會指向實作該方法的原始物件。 對於函數來說,this 則會在叫用該函數時指向關聯物件。
※ 此例,在top.aFunc 函數運算式內部trace(this)則this指向top的類別物件[object MovieClip] ; trace(this.name)則指向top的name屬性topMC ; 在top.aFunc 函數運算式外部trace(this)則指向[object MainTimeline]
※ 動態產生的函數可被delete刪除
在元件庫內,AAA是個圓形MovieClip,綁定AAA內建資源類別

1000715_function_test_1.swf


var top:MovieClip = addChild(new MovieClip()) as MovieClip;
top.name = "topMC";

/*動態建立函式運算式*/
top.aFunc = function():DisplayObject{
trace("----------------------------------");
trace("@@@在top.aFunc()之內的trace");

/*以下這兩行雖然是trace(),但都會先new出AAA的實體,再trace出來*/
trace("@top.aFunc() / addChild(new AAA()) : " + addChild(new AAA())); //[object AAA]
trace("@top.aFunc() / getQualifiedClassName(addChild(new AAA())) : " + getQualifiedClassName(addChild(new AAA()))); //AAA

/*1118: 靜態類型 flash.display:DisplayObject 的值
以隱含方式強制轉型成可能不相關的類型 AAA。*/
/*var aaa:AAA = addChild(new AAA());*/

/*以下這行可以*/
/*var aaa:AAA = addChild(new AAA()) as AAA;*/

var aaa:AAA = this["addChild"](new AAA());
aaa.x=aaa.y=200;

/*this 會在此函數(top.aFunc()函數) 被叫用時,指向關聯物件*/
/*top.aFunc()函數 - 動態建立給top實體的函數運算式*/
trace("@top.aFunc() / this : " + this); /*[object MovieClip]*/
trace("@top.aFunc() / this.name : " + this.name); //topMC
trace("@top.aFunc() / getQualifiedClassName(this) : " + getQualifiedClassName(this)); //flash.display::MovieClip
trace("@top.aFunc() / getQualifiedSuperclassName(this) : " + getQualifiedSuperclassName(this)); //flash.display::Sprite
trace("----------------------------------");

return aaa;
}


trace("----------------------------------");
trace("@@@在top.aFunc()之外的trace");
trace("@this : " + this); //[object MainTimeline]
trace("@this.name : " + this.name); //root1
trace("getQualifiedClassName(this) : " + getQualifiedClassName(this)); //_1000715_function_test_1_fla::MainTimeline
trace("getQualifiedSuperclassName(this) : " + getQualifiedSuperclassName(this)); //flash.display::MovieClip
trace("----------------------------------");

trace("top.aFunc : " + top.aFunc); //function Function() {}
/*在以下這行會先調用了top.aFunc(),之後才trace出來*/
trace("※※※top.aFunc() : " + top.aFunc()); //[object AAA]
/*top.aFunc();*/
trace("----------------------------------");

/*delete 動態產生的top.aFunc 函數運算式*/
delete top.aFunc;
trace("@@@在delete top.aFunc之後的trace");
/*top.aFunc = null;*/
trace("top.aFunc : " + top.aFunc); //undefined
/*底下這行會先調用top.aFunc(),之後再trace出來*/
trace("top.aFunc() : " + top.aFunc()); //TypeError: Error #1006: aFunc 不是函數。at _1000715_function_test_1_fla::MainTimeline/frame1()
/*top.aFunc();*/

沒有留言: