我有一个JS类,它接受了几个参数:
var MyClassName = function(arg1, arg2, arg3){
// Do stuff
};
我有一个String,表示类的名称和一个参数数组。
var class = "MyClassName"
var args = ["1", "2", "3"]
使用类名的String和参数数组,如何实例化该类?原型绑定/应用似乎有一些相关性,但我无法弄清楚这一切是如何协同工作的。我也尝试使用窗口[" MyClassName"],但是会抛出一个未定义的错误。有什么建议吗?
答案 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
:
eval
'代码执行速度更慢(无法编译/缓存
eval
' d代码)解决方案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, ...]);