В 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.Это все еще немного работы, поэтому у меня двоякий вопрос: