2011-04-30 175 views
13

新javascript對象我想創建(使用簡單的繼承)在JavaScript的新對象,使得該對象的類是從變量定義:創建從可變

var class = 'Person'; 
var inst = new class 

任何想法?

回答

29

你可以做這樣的事情

function Person(){}; 
var name = 'Person'; 
var inst = new this[name] 

的關鍵是隻是引用擁有這就是構造函數的對象。這在全局範圍內工作正常,但如果您將代碼傾倒在函數內部,則可能必須更改引用,因爲this可能無法工作。

編輯:要傳遞的參數:

function Person(name){alert(name)}; 
var name = 'Person'; 
var inst = new this[name]('john') 
+0

+1非常好的meder – alex 2011-04-30 01:46:56

+0

謝謝!我如何傳遞參數? – yee379 2011-04-30 01:48:21

+1

你也可以使用'apply'來傳遞參數,如果你事先不知道這些參數,這很有用。 'this [name] .apply(null,args)'其中args是一個參數/參數數組。在動態調用函數時,往往會出現這種情況。 – 2011-04-30 13:19:30

6

這裏是我如何做到這一點。與meder的答案類似。

var className = 'Person' 
// here's the trick: get a reference to the class object itself 
// (I've assumed the class is defined in global scope) 
var myclass = window[className]; 
// now you have a reference to the object, the new keyword will work: 
var inst = new myclass('params','if','you','need','them'); 
+0

非常有幫助。謝謝。這比Meder的答案要好,因爲你可以將'className'作爲參數傳遞給父函數,並且由於蘊涵方法而將它用於任何類。至少,我設定它的方式。 – BarryMode 2016-06-26 22:04:28

-1

我在Node.js中有類似的問題,當我必須根據數據動態創建不同的處理程序對象時。首先,我將所有可用的處理程序(作爲單獨的模塊實現)收集到一個對象中。在一個簡單的情況下,這可以像這樣硬編碼。

var handlers = { 
    handlerX : require('HandlerX'), 
    handlerY : require('HandlerY') 
}; 

然後,每當我不得不實例化一個處理程序,我這樣做是這樣的:

var handlername = getHandlerName() 
var handler = new handlers[handlername](); 

當然,如果你知道這只是工作,或以編程方式確定所有對象你會列表需要創建。

要調用使用功能:

0

要通過MEDER提高對答案上述

只需將包含您指的是類的範圍替代「本」,例如,如果類是寫在如下全球範圍:

function Person(name){alert(name)}; 
var name = 'Person'; 

function classMaker(){ 
    var inst = new window[name]('john'); 
} 

classMaker();