0

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

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().

4

3 回答 3

3

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

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

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

var stringVar = 'MyObject';

var myObject = new constructors[stringVar](1);
于 2012-05-25T16:45:00.423 回答
2

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

var MyNameSpace = {};

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

var stringVar = 'MyObject';
var myObject = new MyNameSpace[stringVar](123);
于 2012-05-25T16:50:22.590 回答
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

于 2012-05-25T16:45:56.900 回答