Javascript 实例化从字符串名获取参数数组的JS对象
我有一个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
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