2

我有一个构造函数,例如 webapp.core.cf1 或 Backbone.Router。但是我得到这个构造函数不是作为参考,而是作为一个字符串!我不能改变这个要求,constr。必须在一个字符串中。如何从中创建一个新对象,例如 classfun("Backbone.Router")?

function classfun (cfstr) 
{ 
  ...
  cf = new window[cfstr]();

如果我以这种方式尝试,我会收到错误消息: ... is not a constructor。

为什么这不起作用?有没有不使用的替代方法eval()

非常感谢提前

编辑

谢谢大家的答案!

谢谢你,Tronix117,这就是问题!

谢谢本杰明舒尔特的功能!

4

3 回答 3

5

如果您在控制台中尝试:

var A=function(a){this.test=a};
b = new window["A"](3);
console.log(b.test); // return 3

这意味着,您正在尝试访问不在窗口范围内的东西,它应该是这样的:window.something["A"],如果您不知道是什么,something那么您应该使用该功能本杰明的,否则使用这个,因为它更快。

于 2012-04-19T12:57:06.920 回答
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();

仍然可以优化,但应该以这种方式工作。

于 2012-04-19T12:51:59.920 回答
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);

这将允许您通过其名称实例化对象并允许您根据需要传递参数。

于 2012-04-19T12:55:20.683 回答