Еще один способ сделать это:
Звучит много времени, но на самом деле это займет 5 минут.
Если функция MarioKartMenu
определена в глобальной области, вы можете получить к ней доступ по ее строковому имени, используя:
window["MarioKartMenu"]
Это работает, потому что все глобальные переменные являются свойствами объект окна
.
Учитывая вышеизложенное, вы можете реализовать то, что хотите, используя:
var menuConstructor = window[build.effect];
var animationClass = new menuConstructor(el, build);
Просто назначьте конструктор build.effect
(не строку, содержащую его имя), и он должен работать:
animate = function(el, build) {
var animationClass = new build.effect(el,build);
}
// ...
b = ...;
b.effect = MarioKartMenu;
animate(e, b);
Моя первая мысль - использовать оператор JavaScript eval ()
, хотя я понимаю, что это менее чем элегантное решение. (Что-то вроде этого: var animationClass = eval ("new" + build.effect + "(el, build)");
, хотя я не уверен, что это правильно, поскольку я не использовал eval ()
, как раньше. ). Ответ Аймана - гораздо лучший вариант этой идеи.
Моя вторая мысль заключается в том, что MarioKartMenu
не абстрагируется надлежащим образом. Поэтому я бы построил вокруг него простой класс, который принимает имя эффекта в качестве третьего параметра и использует оператор switch ()
для выбора среди всех доступных эффектов, создает экземпляр правильного и возвращает его.