Новый экземпляр объекта Javascript из имени динамической функции

В PHP можно использовать строку для динамического выбора класса для создания экземпляра. Вот 2 простых класса в PHP:

Теперь может быть такая переменная, что экземпляр класса, созданный во время выполнения, основан на ее содержимом

$sGeniusClass = 'Magic';
$oGenius      = new $sGeniusClass();

Теперь в Javascript мне нравится использовать функции в качестве конструкторов, чтобы иметь некоторый уровень типизированности , в этом ключе я мог бы сказать:

function Magic() {}
Magic.prototype = {
  perform : function()
  {
    console.log('madya look :P');
  }
}

function Genie() {}
Genie.prototype = {
  perform : function()
  {
    console.log('your wish has been granted!');
  }
}

Я знаю, что могу реализовать что-то похожее на PHP с помощью eval :

Подход №1

var sClassName = 'Genie';
eval('var oGenius = new ' + sClassName);

Я также видел подход , который вызывает функцию Function :

Подход №2

var sClassName = 'Genie';
var oGenius = new Function('return new ' + sClassName)();

На MDN , хотя похоже, что производительность страдает от переоценки каждый раз, когда создается экземпляр :

Функциональные объекты, созданные с помощью конструктора Function, анализируются, когда функция создана. Это менее эффективно, чем объявление функция и вызывая ее в вашем коде, потому что функции объявлены с оператором функции анализируются с остальной частью кода.

Теперь у меня есть еще один подход, который немного утомителен:

Подход № 3

var aClassMap = {
  Magic : Magic,
  Genie : Genie,
  create : function(sClassName) {
    if(this[sClassName] === undefined)
      return false;
    return new this[sClassName];
  }
}

var sClassName = 'Genie';
var oGenius = aClassMap.create(sClassName);

Кажется, он мой любимый в целом, без использования eval и без последующей переоценки, как решение №2.Это все еще немного работы, поэтому у меня двоякий вопрос:

  1. Есть ли какие-либо другие способы сделать это, кроме трех подходов, которые я показал?
  2. Есть ли что-то похожее на PHP, где строка может отображаться на функция для создания экземпляра?

5
задан quickshiftin 10 February 2012 в 03:07
поделиться