我可以使用带构造函数的apply()来传递任意数量的参数

时间:2010-10-06 16:42:08

标签: flash actionscript-3 constructor new-operator apply

我有一个函数可以接受带有rest运算符的多个参数。

我想创建一个对象,将使用rest运算符收集的参数直接传递给构造函数而不创建对象并调用初始化函数并且不传递整个数组但是参数啊我用apply()函数。

有可能吗?使用apply不起作用。

public function myFunc(...arg) {

     // something link "new MyClass.apply(args)"
     return new MyClass();

}

4 个答案:

答案 0 :(得分:14)

不幸的是没有。没有办法使构造函数的应用工作。通常做的是根据参数的数量准备一些调用:

public function myFunc(...arg):Myclass {
  switch (arg.length) {
    case 0:return new MyClass();
    case 1:return new MyClass(arg[0]);
    case 2:return new MyClass(arg[0], arg[1]);

    //... etc

    case n:return new MyClass(arg[0], arg[1],..,arg[n]);
    default: throw new Error("too much arguments in myFunc");
  }
}

答案 1 :(得分:2)

这导致我进行了一项有趣的长期研究!

我发现这个整齐的SWC文件充满了用于模仿AS2 eval()的utils: http://www.riaone.com/products/deval/index.html

这是一个概念证明,你正在寻找的东西可能确实有效:

package tests {
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.utils.getQualifiedClassName;
    import r1.deval.D;

    public class RandomTests extends Sprite{

        public function RandomTests() {
            super();

            var test:BitmapData =   create(BitmapData, 100, 100, true, 0x00000000);
            trace(test);
        }


        public function create( pClass:Class, ... pArgs ):* {
            D.importClass(pClass);
            var fullQName:String =  getQualifiedClassName(pClass);
            var qNameSplit:Array =  fullQName.split("::");
            var className:String =  qNameSplit[1];
            fullQName =             qNameSplit.join(".");

            var statements:String =
            "import $0;\n" +
            "return new $1($2);";


            var args:Array =        [];
            for (var a:int = 0, aLen:int = pArgs.length; a < aLen; a++) {
                switch(pArgs[a].constructor) {
                    case String:
                        args[a] =   "\"" + pArgs[a] + "\"";
                        break;
                    default:
                        args[a] =   pArgs[a];
                        break;
                        //throw new Error("Unhandled type, please add it: " + pArgs[a].constructor);
                }
            }

            return D.eval(XString.gsub(statements,[fullQName, className, args.join(",")]));
        }
    }

}

很抱歉依赖项(就像我的XString类一样,可以轻松进行子替换),但它在理论上确实有用。唯一的问题是将对象引用作为参数条目传递。但是又一次...... r1.deval.D类可能会接受它......嗯。

无论如何,想想也许这值得分享。

答案 2 :(得分:0)

嗯也有这个

public function myFunc(args:Object) {

   //then access various argumens
   return new MyClass(args.name, args.id, args.active)

}

并通过myFunc({id:33,name:'jo')

进行调用

然后你可以传递这个对象,或者这远远超出你想要的东西?

答案 3 :(得分:0)

我在寻找的答案太多,但太难过,看到的答案是否定的......

这是我当前(不太好)做这种事情的方式,希望你们有些兴趣:

// Foo.as
public class Foo {
    // construct
    public function Foo(... args):void {
        create.apply(this, args);
    }

    // this function do as a really construct function, tricky stuff
    function create(id:uint, name:String) {
        trace(id, name);
    }
}

// Bar.as
// for create this kind of class, just new it as usual
...
var foo:Foo = new Foo(123, "abc");
...