实例化JS对象,该对象从String name

时间:2015-06-01 23:16:18

标签: javascript class object dynamic

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

var MyClassName = function(arg1, arg2, arg3){ // Do stuff };

我有一个String,表示类的名称和一个参数数组。

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

使用类名的String和参数数组,如何实例化该类?原型绑定/应用似乎有一些相关性,但我无法弄清楚这一切是如何协同工作的。我也尝试使用窗口[" MyClassName"],但是会抛出一个未定义的错误。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您可以使用eval

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

示例:

JSFIDDLE:https://jsfiddle.net/s40ave7r/

function A(a1,a2,a3) {
    this.a1 = a1;
    this.a2 = a2;
    this.a3 = a3;
}

var className = "A";
var arguments = [1,2,3];

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

console.log(a); // A {a1:1, a2:2, a3:3}

注意

一般情况下使用eval是一个坏主意。如果你可以试着避免它。这些是与eval

相关的一些问题
  1. 不当使用eval会打开您的注射攻击代码
  2. 调试可能更具挑战性(没有行号等)
  3. eval'代码执行速度更慢(无法编译/缓存 eval' d代码)
  4. 解决方案2

    其他解决方案是将类定义附加到对象。例如,在全局范围内定义类时,默认情况下会将其附加到浏览器中的window对象或节点中的global对象。所以你可以这样做:

    浏览器

    function MyClass() {}
    new window["MyClass"](arg1, arg2..);
    

    节点

    function MyClass() {}
    new window["MyClass"](arg1, arg2..);
    

答案 1 :(得分:1)

您可以将“课程”定义为

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

此代码正常运行,但可能您忘记了“新”。如果您在没有“新”的情况下尝试此操作,则会在Chrome中抛出此错误:

Uncaught TypeError: Cannot read property 'foo' of undefined

答案 2 :(得分:0)

谢谢大家的精彩建议。除了this SO answer之外,我在此处结合了部分答案:

var className = new window['MyClassName'] var instantiatedClass = className.bind.apply(className, [null, arg1, arg2, ...]);