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 对象。如果在脚本实际执行前,无法知道要传递的参数的数量,那么这种方法通常很有用。






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