2012-03-21 204 views
16

是否可以使用字符串創建新對象? 例如,如何將字符串「product」轉換爲var p = new Product從字符串創建對象

在此先感謝。

編輯

我想要做的是有一個菜單<a href="#home"></a><a href="#products">products</a>從HREF每次創建相應的對象。

+0

你希望用它做什麼? – Joseph 2012-03-21 11:44:02

+1

將'product'轉換爲'var p = new Product'的規則是什麼?我可以理解'新產品',但爲什麼'p'? – 2012-03-21 11:44:31

+0

@christ:這聽起來很危險,特別是如果字符串來自用戶...爲什麼你認爲這是一個好主意?你有沒有考慮過其他方法? – 2012-03-21 11:44:55

回答

60

如果你知道上下文,是的。假設您在瀏覽器環境中,並且Person是全局構造函數。因爲任何全局變量是全局對象的屬性,這意味着你可以通過全局對象window訪問Person

var p = new Person() 

等同於:

var p = new window.Person() 

所以,你可以用方括號符號:

var p = new window["Person"](); 

當然這對每一種物體都是有效的。如果你不想污染全球範圍內,你可以有:

var mynamespace = {}; 

mynamespace.Person = function Person() {..} 

var p = new mynamespace["Person"](); 
+3

這是比我的更好的解決方案+1 – 2012-03-21 11:57:11

+0

我嘗試使用新窗口[「Namespace.MyClass」]()創建對象,但看起來不起作用。我們如何在類包含模塊時創建對象? – 2014-01-09 15:50:07

+0

@NarendraV嘗試新窗口[「命名空間」] [「MyClass」]()?(這只是一個猜測,我不知道這會起作用) – 2014-01-10 11:53:27

6

那麼你總是可以使用可怕的不安全和illadvised eval()。 例如

var myStr = "Product" 
var p = eval("new " + myStr + "()"); 

,或者可能是:

var myStr = "Product" 
eval("var p = new " + myStr + "()"); 

但它充滿了潛在的漏洞,特別是如果字符串是從用戶輸入的到來。

+0

嘗試在eval中搜索「use strict」 – Joseph 2012-03-21 11:50:00

+2

這可以通過名稱 - >構造函數映射更好地解決。 – 2012-03-21 11:54:01

+0

+1當程序生成輸入時,完美 – smirkingman 2013-05-02 19:41:22

1

只是另一種實現方式:

var nameOfThang = 'Person'; 
var nameOfThingzName = 'The Dude'; 

var thangs = { Person: {name: 'Legowski'}, Cars: {} }; 
var person = new (eval(thangs[nameOfThang].constructor))(); 
person.name = new (eval(thangs.Person.name.constructor))(nameOfThingzName) .toString(); 

console.log('@thang, #Person', person); 
相關問題