我有一个构造函数,例如webapp.core.cf1或Backbone.Router。但我得到这个构造函数不是作为参考,而是作为一个字符串!我不能改变这个要求,这个建议。必须是一个字符串。如何从中创建一个新对象,例如classfun(“Backbone.Router”)?
function classfun (cfstr)
{
...
cf = new window[cfstr]();
如果我这样尝试,我会收到错误:...不是构造函数。
为什么这不起作用?有没有使用eval()
的替代方法?
提前多多感谢
修改
谢谢大家的答案!
谢谢你,Tronix117,这就是问题!!感谢Benjamin Schulte的功能!
答案 0 :(得分:5)
如果您在控制台中尝试:
var A=function(a){this.test=a};
b = new window["A"](3);
console.log(b.test); // return 3
这意味着,你试图访问不在窗口范围内的东西,它应该是这样的:window.something [“A”],如果你不知道什么是{{1那么你应该使用本杰明的功能,否则使用这个,因为它的速度更快。
答案 1 :(得分:3)
你可以这样做(如果我理解正确的话):
function getObjectByName(name) {
var nameParts = name.split('.');
var nameLength = nameParts.length;
var scope = window;
for (var i=0; i<nameLength; ++i) {
scope = scope[nameParts[i]];
}
return scope;
}
var ObjectClass = getObjectByName(cfstr)
new ObjectClass();
仍然可以进行优化,但应该以这种方式工作。
答案 2 :(得分:1)
ReflectUtil.newInstance = function(strClass) {
var args = Array.prototype.slice.call(arguments, 1);
var clsClass = eval(strClass);
function F() {
return clsClass.apply(this, args);
}
F.prototype = clsClass.prototype;
return new F();
};
SomeClass = function(arg1, arg2) {
// ...
}
ReflectUtil.newInstance('SomeClass', 5, 7);
这将允许您按名称实例化对象,并允许您根据需要传递参数。