2012-05-25 152 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);