例如,我有一个功能:
function doSomething( a:String, b:Number, c:Array ):void {
trace( a + b + c.toString() );
}
...我有一个对象,其中包含我想要传递参数的所有元素:
var args:Object = { 'dog', 11, myArray };
...我希望能够将args的内容传递给doSomething而不对doSomething进行任何更改(假设它是别人的功能),我想以一种不假设我会知道的方式来做关于args内容的任何内容。
这可能吗?
答案 0 :(得分:5)
您是Python开发人员吗? ;)
你必须将你的args:Object变成args:Array,然后调用doSomething.apply(this,argsArray)。这里的问题是你的args:Object中的参数没有被排序,因此循环它们将它们变成一个传递给apply()的数组将不会产生可预测的参数序列。
除非您有策略在对象到数组转换中强制执行正确的属性顺序,否则听起来不行。
答案 1 :(得分:2)
您要使用的是Function.apply()。为此,您需要将“args”对象从示例更改为数组。
然后你将构建像:
这样的对象var myObject:Object = { command: doSomething, args: [ "dog", 11, myArray ] };
其中command
是对要调用的函数的引用,args
是command
所需的参数列表。然后,拨打doSomething
:
myObject.command.apply(this, myObject.args)
作为额外的奖励,这将适用于任何具有任意数量参数的函数,您只需要更改command
中args
和myObject
的值。因此,您可以传入符合这些规则的对象列表,并在不必更改任何此代码的情况下循环遍历它们。
答案 2 :(得分:0)
您应将对象值传递为
var args:Object = { a:'dog', b:11, c:myArray };
function doSomething( args.a, args.b, args.c );
答案 3 :(得分:0)
编辑:对,我现在添加了另一种方法,可以采用任何形式的任意数量的参数。它基本上会为您提供一个要处理的参数数组。
private var _testObject:Object;
private function init():void{
_testObject = {str:"test", num:11, arr:["test","array"]};
doSomething(_testObject.str, _testObject.num, _testObject.arr);
}
private function doSomething(...args):void{
trace(args.toString());
}
当然需要在类或脚本标记内,但如果调用init方法,则应该看到以下跟踪:test,11,test,array
希望有所帮助。