为什么不简单地将构造函数传递到require
方法?这样你就可以避开从名称转换为函数的整个问题。您的示例将如下所示:
Db.using(db) //the database object
.require(Table1Db, 'doFoo', 'success') //table constructor, function name, expected callback
.require(Table2Db, 'doBar', 'notFound')
.then(doStuff);
但是,如果你真的想使用字符串......
为什么你死心塌地避免使用eval
?它是语言中的一个工具,每个工具都有其目的(就像每个工具都可能被滥用一样)。如果您担心允许任意执行,一个简单的正则表达式测试应该可以保证您的使用安全。
如果你一心想逃避eval
如果所有构造函数都是在默认全局范围(即 window 对象)中创建的,则这将起作用:
function create(name) {
return new window[name]();
}
如果您想获得奇特的并支持命名空间对象(即create('MyCompany.MyLibrary.MyObject')
,你可以这样做:
function create(name) {
var current,
parts,
constructorName;
parts = name.split('.');
constructorName = parts[parts.length - 1];
current = window;
for (var i = 0; i < parts.length - 1; i++) {
current = current[parts[i]];
}
return new current[constructorName]();
}