在AS3中,如何将对象的内容作为函数的参数传递?

时间:2012-01-30 20:59:21

标签: flash actionscript-3 flex

例如,我有一个功能:

function doSomething( a:String, b:Number, c:Array ):void {
  trace( a + b + c.toString() );
}

...我有一个对象,其中包含我想要传递参数的所有元素:

var args:Object = { 'dog', 11, myArray };

...我希望能够将args的内容传递给doSomething而不对doSomething进行任何更改(假设它是别人的功能),我想以一种不假设我会知道的方式来做关于args内容的任何内容。

这可能吗?

4 个答案:

答案 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是对要调用的函数的引用,argscommand所需的参数列表。然后,拨打doSomething

myObject.command.apply(this, myObject.args)

作为额外的奖励,这将适用于任何具有任意数量参数的函数,您只需要更改commandargsmyObject的值。因此,您可以传入符合这些规则的对象列表,并在不必更改任何此代码的情况下循环遍历它们。

答案 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

希望有所帮助。