Почему бы просто не передать функцию конструктора в метод 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
и если все ваши функции конструктора созданы вглобальная область по умолчанию (т.е. объект окна), это будет работать:
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]();
}