Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 实例化从字符串名获取参数数组的JS对象_Javascript_Class_Object_Dynamic - Fatal编程技术网

Javascript 实例化从字符串名获取参数数组的JS对象

Javascript 实例化从字符串名获取参数数组的JS对象,javascript,class,object,dynamic,Javascript,Class,Object,Dynamic,我有一个JS类,它接受几个参数: var MyClassName=函数(arg1、arg2、arg3){ //做事 }; 我有一个表示类名称的字符串和一个参数数组 var class = "MyClassName" var args = ["1", "2", "3"] 使用类名字符串和参数数组,如何实例化该类?原型绑定/应用似乎有一定的相关性,但我不太明白这一切是如何协同工作的。我也尝试过使用window[“MyClassName”],但这会引发一个未定义的错误。有什么建议吗?您可以使用eva

我有一个JS类,它接受几个参数:

var MyClassName=函数(arg1、arg2、arg3){
//做事
};

我有一个表示类名称的字符串和一个参数数组

var class = "MyClassName"
var args = ["1", "2", "3"]

使用类名字符串和参数数组,如何实例化该类?原型绑定/应用似乎有一定的相关性,但我不太明白这一切是如何协同工作的。我也尝试过使用window[“MyClassName”],但这会引发一个未定义的错误。有什么建议吗?

您可以使用
eval

var a = eval("new " + className + " ( " + arguments.toString() + ")");
例如:

JSFIDDLE:

注意

通常使用
eval
是个坏主意。如果你能尽量避免的话。以下是与
eval
相关的一些问题:

var a = eval("new " + className + " ( " + arguments.toString() + ")");
  • 不正确地使用eval会打开代码进行注入攻击
  • 调试可能更具挑战性(无行号等)
  • eval
    'd代码执行速度较慢(没有编译/缓存的机会
    eval
    'd代码)
  • 解决方案2

    另一种解决方案是将类定义附加到对象。例如,在全局范围中定义类时,默认情况下,该类会附加到浏览器中的
    窗口
    对象,或节点中的
    全局
    对象。因此,您可以:

    浏览者

    节点


    您可以将“类”定义为

    window.MyClassName = function( arg1, arg2, ... ) {
        this.arg1 = arg1;
        //...
    };
    
    那你就可以用

    var instance = new window['MyClassName']( arg1, arg2, ... ) 
    
    或与

    var instance = new window.MyClassName( arg1, arg2, ... );
    
    或者最好不要使用窗口,使用自己的对象

    var classes = {
        MyClassName: function( arg1, arg2, ... ) {
            this.arg1 = arg1;
            //...
        }
    };
    
    var instance = new classes.MyClassName( arg1 );
    
    编辑:您说过窗口[“MyClassName”]不起作用,但是如果您在全局范围中定义了一个“类”,那么您可以这样调用它。你能加上你所说的错误吗

    function testClass( arg1 ) {
        this.foo = arg1;
    }
    
    var instance = new window['testClass']( 'bar' );
    console.log( instance.foo ); // The output will be bar
    
    此代码正在运行,但您可能忘记了“new”。如果您在没有“new”的情况下尝试此操作,则会在Chrome上抛出此错误:

    Uncaught TypeError: Cannot read property 'foo' of undefined
    

    谢谢大家的建议。除此之外,我还将部分答案组合在一起:

    var className=新窗口['MyClassName']
    var instantiatedClass=className.bind.apply(className,[null,arg1,arg2,…);
    

    很抱歉,我没有理解你的回答。为了澄清,我正在尝试根据类名的字符串实例化一个新的类实例。该类接受多个参数,但我只想向其传递一个或多个参数。编辑:再次回答错误。。我该睡觉了。你能解释一下为什么要这样做吗?这可能有助于某人提供更好的解决方案。
    function testClass( arg1 ) {
        this.foo = arg1;
    }
    
    var instance = new window['testClass']( 'bar' );
    console.log( instance.foo ); // The output will be bar
    
    Uncaught TypeError: Cannot read property 'foo' of undefined