Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从变量创建新的javascript对象_Javascript_Oop - Fatal编程技术网

从变量创建新的javascript对象

从变量创建新的javascript对象,javascript,oop,Javascript,Oop,我想在javascript中创建一个新对象(使用简单继承),以便通过变量定义对象的类: var class = 'Person'; var inst = new class 有什么想法吗?你可以这样做 function Person(){}; var name = 'Person'; var inst = new this[name] 键只是引用拥有构造函数的函数的对象。这在全局范围内可以正常工作,但是如果在函数内部转储代码,则可能必须更改引用,因为这可能不起作用 编辑:要传递参数: fun

我想在javascript中创建一个新对象(使用简单继承),以便通过变量定义对象的类:

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

有什么想法吗?

你可以这样做

function Person(){};
var name = 'Person';
var inst = new this[name]
键只是引用拥有构造函数的函数的对象。这在全局范围内可以正常工作,但是如果在函数内部转储代码,则可能必须更改引用,因为
可能不起作用

编辑:要传递参数:

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

当我了解javascript中的不同继承模式时,这篇演讲真的很有帮助。示例代码包含在第二个链接中(视频介绍了它)


我是这样做的。类似于梅德尔的回答

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');

我在Node.js中遇到了类似的问题,当时我必须根据数据动态创建不同的处理程序对象。首先,我在一个对象中收集了所有可用的处理程序,它们作为单独的模块实现。在一个简单的情况下,可以这样硬编码

var handlers = {
  handlerX : require('HandlerX'),
  handlerY : require('HandlerY')
};
然后,每当我必须实例化一个处理程序时,我都是这样做的:

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

当然,这只有在您知道或者可以通过编程确定需要创建的所有对象的列表时才有效。

要改进meder的上述答案,请执行以下操作:

要使用函数调用,请执行以下操作:

您只需将“this”替换为包含您所引用的类的范围,例如,如果该类是在如下所示的全局范围中编写的:

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

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

classMaker();

您还可以使用
apply
传递参数,如果您事先不知道这些参数,这将非常有用,例如
this[name]。apply(null,args)
其中args是参数/参数的数组。在动态调用函数时,这种情况似乎更常见。此解决方案使我不用使用eval()。非常感谢。这个解决方案似乎迫使您创建一个全局变量。您知道如何在不泄漏全局var的情况下执行此操作吗?我没有找到在函数中用合适的引用来替换
这个
。有没有办法在coffeescript中实现这一点?创建一个基于类的coffeescript应用程序,并且能够使用变量名实例化类会很好。@meder:回答得不错。但是我们如何在NodeJS中做到这一点呢。我们没有窗口对象的地方。任何俱乐部都很有帮助。非常感谢。这比Meder的答案要好,因为您可以将
className
作为父函数中的参数传递,从而根据隐含方法将其用于任何类。至少,按照我的安排。