Создание класса динамически через переменную - PullRequest
5 голосов
/ 29 мая 2009

Как создать экземпляр класса, добавив имя переменной? Рассмотрим этот метод внутри класса:

animate: function(el, build) { 
        console.log(build.effect); 
        var animationClass = new build.effect(el,build); 
}, 

Сборка - это объект, содержащий много вещей, но самое главное «Эффект». Этот эффект является именем независимого класса анимации: один называется "MarioKartMenu".

console.log (build.effect) выводит «MarioKartMenu». Но, конечно, я получаю: TypeError: Результат выражения 'build.effect' [MarioKartMenu] не является конструктором.

Если я уничтожу динамизм и просто сделаю код таким:

animate: function(el, build) {
        var animationClass = new MarioKartMenu(el,build);
    }, 

Работает просто отлично. Можно ли сделать его динамичным, как я пытаюсь сделать?

Ответы [ 3 ]

5 голосов
/ 29 мая 2009

Если функция MarioKartMenu определена в глобальной области видимости, вы можете получить к ней доступ по ее строковому имени, используя:

window["MarioKartMenu"]

Это работает, потому что все глобальные переменные являются свойствами объекта window.

Учитывая вышесказанное, вы можете реализовать то, что вы хотите, используя:

var menuConstructor = window[build.effect];
var animationClass = new menuConstructor(el, build);
2 голосов
/ 29 мая 2009

Просто присвойте конструктору build.effect (не строку, содержащую его имя), и он должен работать:

animate = function(el, build) {
    var animationClass = new build.effect(el,build);
}
// ...

b = ...;
b.effect = MarioKartMenu;
animate(e, b);
0 голосов
/ 29 мая 2009

Моя первая мысль - использовать оператор JavaScript eval(), хотя я понимаю, что это не слишком элегантное решение. (Примерно так: var animationClass = eval("new "+build.effect+"(el, build)");, хотя я не уверен, что это правильно, поскольку я не использовал eval(), как это раньше.). Ответ Аймана - намного лучший вариант этой идеи.

Моя вторая мысль заключается в том, что MarioKartMenu не является абстрагированным подходящим образом. Поэтому я построю вокруг него простой класс, который принимает имя эффекта в качестве третьего параметра и использует оператор switch() для выбора среди всех доступных эффектов, создает экземпляр правильного и возвращает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...