调用字符串构造函数

时间:2012-04-19 12:46:53

标签: javascript

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

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

如果我这样尝试,我会收到错误:...不是构造函数。

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

提前多多感谢

修改

谢谢大家的答案!

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

感谢Benjamin Schulte的功能!

3 个答案:

答案 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);

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