2011-04-13 61 views
6

我想從Javascript中獲取其名稱的對象。 我正在研究一個需要加載一些不同的上下文的應用程序,我想這樣用「繼承」jquery插件加載不同的類。一切正常,除此之外,當我需要實例化一個類時,我不能,因爲我只有類的名稱而不是直接的對象。從javascript中的字符串名稱獲取對象類

基本上,我想找到'getClass(String name)'之類的東西。有人可以幫助我嗎?

+0

好吧,這是愚蠢的,但使用「的eval()函數在我的對象做的伎倆...... 對不起,我這個沒用的帖子... – Celero 2011-04-13 08:19:26

回答

10

請勿使用eval()

你可以存儲你的類中的地圖:

var classes = { 
    A: <object here>, 
    B: <object here>, 
    ... 
}; 

,然後只是看看他們:

new classes[name]() 
+0

爲什麼用「的eval()的名稱' 是錯的 ?我不能這樣做,我的「類」是通用的,必須加載在某些特定的上下文中,我不能加載這樣的地圖... – Celero 2011-04-13 08:52:58

+0

@Celero:因爲可以使用eval()執行可能具有安全風險的任意代碼。它提供了比你需要的更多的能量。爲什麼你不能使用地圖?你對通用和你在說什麼背景是什麼意思?如果您提供更多信息,我們可以更好地饒你。 – 2011-04-13 08:57:24

+0

我真的錯了,你的技巧可以根據需要應用。謝謝 ! – Celero 2011-04-13 09:04:29

5

JavaScript: Call Function based on String

function foo() { } 
this["foo"](); 
+0

這個,基本上和eval()一樣,不是嗎? – Celero 2011-04-13 08:55:34

+0

@Celero - no。以全局代碼運行,* this *將引用gobal/window對象,因此相當於* window ['foo'] *。如果你在其他範圍內使用它,你可能不知道* this引用了什麼。它不**引用作用域的變量或激活對象(即執行上下文),這是你想要的,因爲它位於變量解析鏈上的對象之上。 – RobG 2011-04-13 09:03:52

+0

好的,謝謝你的準確性。 – Celero 2011-04-13 09:11:41

0

你的意思呢?

function Person(name){ 
    this.name = name; 
} 

function getClass(str_name, args){ 
    return new (window[str_name])(args); 
} 

var wong2 = getClass("Person", "wong2"); 

alert(wong2.name); // wong2 
+0

不,我在其中一些類中繼承了一些類,我只需要在特定情況下一次加載其中的一個類。這就是爲什麼eval()對我來說很好...... – Celero 2011-04-13 08:54:25

+0

@celero你能舉個例子嗎?也許有些代碼? – wong2 2011-04-13 08:56:22

+0

對不起,我不能,無論如何,我要去嘗試菲利克斯克林技術,看看...謝謝你的幫助 – Celero 2011-04-13 09:05:55

相關問題