[英]Javascript new object instance from dynamic function name
在PHP中,字符串可用于动态选择用于实例化的类。 以下是PHP中的两个简单类:
<?php
class Magic implements Genius {
public function perform() {
echo 'madya look :P' . PHP_EOL;
}
}
class Genie implements Genius {
public function perform() {
echo 'your wish has been granted!' . PHP_EOL;
}
}
现在可能存在一个变量,使得在运行时实例化的类基于其内容
$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!');
}
}
我知道我可以使用eval来实现与PHP类似的东西:
方法#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。 虽然这仍然有点工作,所以我的问题是双重的:
我认为你涵盖了所有这些。 但是,您可以通过记住全局变量和函数是窗口对象的属性来简化第3种方法,因此您可以使用window
创建全局类,如下所示:
var myClassName = "Genie";
window[myClassName] = function {};
window[myClassName].prototype = {
perform : function()
{
console.log('I am a ' + myClassName + ', and your wish has been granted!');
}
}
我认为性能将一如既往(因为Javascript内部使用哈希表来引用对象属性,无论如何)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.