2011-04-30 176 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();