2012-05-25 115 views
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()

+3

我相信你有什么,是做它的一种可接受的方式。 “环境中性”是什么意思? –

+1

你是什么意思与上下文中性?你总是需要至少对函数的位置,窗口对象或其他位置有所了解。 – bigblind

+0

对不起:环境中立。可以在除浏览器以外的环境下工作的代码。 –

回答

3

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

所以,如果你想把所有这些放在关闭中,那就行不通了。你唯一的选择就是让你的构造另一个对象的方法:

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

var stringVar = 'MyObject'; 

var myObject = new constructors[stringVar](1); 
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

+2

我想你的意思是'obj [str]'。 –

2

使用一个命名空间,所以你总是知道层次结构,例如下面将在桌面.js文件运行工作与Windows脚本宿主(那里没有window

var MyNameSpace = {}; 

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

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