php – 来自动态函数名称的Javascript新对象实例

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函数an approach

方法#2

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

On the MDN虽然听起来每次创建实例时都会因重新评估而影响性能

Function objects created with the Function constructor are parsed when
the function is created. This is less efficient than declaring a
function and calling it within your code,because functions declared
with the function statement are parsed with the rest of the code.

现在我还有一种方法有点单调乏味:

方法#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种方法之外,还有其他方法吗?
>是否有类似于PHP的字符串可以映射到要实例化的函数

最佳答案
我认为你涵盖了所有这些.但是,您可以通过记住全局变量函数窗口对象属性来简化第3种方法,因此您可以使用窗口创建全局类,如下所示:

var myClassName = "Genie";
window[myClassName] = function {};
window[myClassName].prototype = {
  perform : function()
  {
    console.log('I am a ' + myClassName + ',and your wish has been granted!');
  }
}

我认为性能将一如既往(因为Javascript内部使用哈希表来引用对象属性,无论如何).

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...