使用字符串值作为要调用的函数的名称

时间:2012-05-25 16:40:32

标签: javascript oop object

我希望能够做到这样的事情:

var MyObject = function(prop) {
  this.property = prop;
};

var stringVar = 'MyObject';

var myObject = new stringVar(1);  // This doesn't work.

assertTrue(myObject.property === 1);

我知道这会奏效:

var myObject = new window[stringVar](1);

但我想知道是否有一种更加背景中立的方式来实现它。

作为旁注:我显然试图避免使用eval()

3 个答案:

答案 0 :(得分:3)

这是Javascript中的已知限制。无法以上下文中立的方式按字符串引用函数。你所拥有的就是你所能做的一切。

所以,如果你要在一个闭包中拥有所有这些,那就行不通了。您唯一的选择是将构造函数作为另一个对象的方法:

var constructors = {
    MyObject: function(prop) {
        this.property = prop;
    }
}

var stringVar = 'MyObject';

var myObject = new constructors[stringVar](1);

答案 1 :(得分:2)

使用命名空间,以便您始终了解层次结构,例如以下内容适用于使用windows脚本主机运行的桌面.js文件(没有window

var MyNameSpace = {};

MyNameSpace.MyObject = function(prop) {
  this.property = prop;
};

var stringVar = 'MyObject';
var myObject = new MyNameSpace[stringVar](123);

答案 2 :(得分:0)

不确定这是否是你想要的:

var obj = {"myObject": function(prop) {this.property = prop; return this;},
           "MySecondObject": "probably second function"
          },
    str = "myObject";
var myChildObj = obj[str]("test");
alert(myChildObj.property);

jsfiddle