我希望能够做到这样的事情:
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()
。
答案 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);