as3 apply() 不定參數(…rest parameters)的二次不定傳遞

對於Function.call() 和Function.apply 再次理解。

參考頁面 http://flash006.com/336

在Cairngorm2中曾看到不定參數不能二次傳遞的bug,後來在使用Adobe的rpc組件時,發現RemoteObject是可以使用不定參數的,而RemoteObject是對NetConnection的封裝,那麼Adobe是如何做到不定參數的二(N?)次傳遞的呢?

實現原理很簡單,僅是用到了Function對象的apply方法:

-----------------------------------------

例子:

package com.test
{
import flash.display.Sprite;

public class ParamsTest extends Sprite
{
public function ParamsTest()
{
super();
a("A", "B", "C");
}


private function a(...args):void{
trace("a()", args);

b.apply(this, args);

b.call(this, args);

b(args);
}


private function b(...args):void{
trace("b()", args, "是數組嗎:", (args[0] is Array) );
try{
c.apply(this, args);
}catch(e:Error){
trace(e);
}
}

private function c(_a:*, _b:*, _c:*):void{

trace("c()", _a, _b, _c);
}
}

}

輸出:

a() A,B,C
[SWF] E:\code\game\SceneAvatar2\bin-debug\ParamsTest.swf - 解壓縮後爲 1,971 個字節
b() A,B,C 是數組嗎: false
c() A B C
b() A,B,C 是數組嗎: true
ArgumentError: Error #1063: com.test::ParamsTest/c() 的參數數量不匹配。應該有 3 個,當前爲 1 個。
b() A,B,C 是數組嗎: true
ArgumentError: Error #1063: com.test::ParamsTest/c() 的參數數量不匹配。應該有 3 個,當前爲 1 個。

說明:

b.apply(this, args);

b.call(this, args);

b(args);

只有apply動用成功!

Function.call() (它將參數指定爲用逗號分隔的列表)不同,該方法將參數指定爲一個 Array 對象。如果在腳本實際執行前,無法知道要傳遞的參數的數量,那麼這種方法通常很有用。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章