Can I use apply() with constructor to pass arbitrary number of parameters

前端 未结 4 546
天命终不由人
天命终不由人 2020-12-10 17:35

I\'ve got a function wich can accept a varible number of parameter with a rest operator.

I want create an object passing the argument collected with the rest opera

4条回答
  •  一整个雨季
    2020-12-10 18:00

    Well this led me to an interesting long research!

    I found this neat SWC file filled with utils for mimicking the AS2 eval(): http://www.riaone.com/products/deval/index.html

    And here's a proof of concept that what you're looking for might actually work:

    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(",")]));
            }
        }
    
    }
    

    Sorry for the bits of dependencies (Like my XString class for easy sub-replacements) but it does work in theory. The only issue would be passing object references as argument entries. But then again... the r1.deval.D class might be able to take it... hmm.

    Anyways, thought maybe this would be worth sharing.

提交回复
热议问题