如何基于类型字符串在javascript中创建新对象?

如何基于类型字符串在javascript中创建新对象?,javascript,dynamic,Javascript,Dynamic,如何基于变量类型字符串(包含对象名称)在javascript中创建新对象 现在我有:(随着更多工具的到来,列表将变得更长…) 并定义了我的工具,如: PointerTool.prototype = new Tool; PointerTool.prototype.constructor = PointerTool; function PointerTool(){ this.name = "PointerTool"; } PointerTool.prototype.click = functio

如何基于变量类型字符串(包含对象名称)在javascript中创建新对象

现在我有:(随着更多工具的到来,列表将变得更长…)

并定义了我的工具,如:

PointerTool.prototype = new Tool;
PointerTool.prototype.constructor = PointerTool;
function PointerTool(){
  this.name = "PointerTool";
}
PointerTool.prototype.click = function(x, y){
  info("You clicked at: "+x+", "+y);
}
我想了解一下(不断增长的)switch语句,它似乎是“错误的”

function getTool(name){
  return ( typeof window[name] === 'function' ) ? 
                                    new window[name]() : {/*some default*/};
}

假设在全局
窗口
命名空间中定义了
PointerTool
构造函数。用你所使用的任何命名空间替换它。

< P>你应该考虑重新思考你的方法。最好有一个类似于
Tools
的对象,它将工具作为属性,比如

Tools = {"SelectTool": SelectTool /* etc */}`.

通过这种方式,您可以以
新工具的形式访问这些工具。选择tool
新工具[var\u with_tool\u name]

在您的示例中,您将
PointerTool
声明为全局范围中的函数。假设您的javascript正在运行浏览器,“全局范围”实际上与
窗口
对象相同。这意味着如果您有一个构造函数:

function PointerTool() {
   ...
}
与此相同:

window.PointerTool = function() {
   ...
}
现在,在getTool函数中,您可以像这样访问构造函数:

function getTool(name){
    return new window[name]();
}
function getTool(name){
    return new myproject.tools[name]();
}

一种更“经得起未来考验”的方法是定义您自己的名称空间对象,您将在其中放置所有不同的工具构造函数。类似这样的内容(“myproject”是您的项目或系统的简称):

那么您的getTool函数将如下所示:

function getTool(name){
    return new window[name]();
}
function getTool(name){
    return new myproject.tools[name]();
}

这种方法可以将您的内容与全局/窗口范围内定义的任何其他内容隔离开来。

假设eval可以做到这一点…@Šime Vidas,但实际上,应不惜一切代价避免eval:D@Gabi,我同意
eval()
在这里不是正确的解决方案,但我很好奇你为什么这么说“应该不惜一切代价避免eval”。这是该语言的一个未被弃用的特性,具有适当(和不适当)的特性使用--就像其他所有功能一样。@Šime:我会让Jeff添加对评论的否决票!:-PSometimes
eval
是唯一的答案,这是应该使用的时候。如果这些对象是在匿名自执行函数中定义的,则不能使用
window[constructor]引用它们
。是的,但即使工具位于不同的名称空间,它也可以工作。如果你使用Node.js,你可以使用全局对象来完成同样的事情。我现在就用这个解决方案,我完全忘记了一切都是一个函数,因此全局
窗口
对象/函数/名称空间:)@Dribbel-听起来不错。我只使用了
窗口
因为我不确定名称空间。如果您使用的是
window
,我建议在其他名称空间中定义它们。可以使用相同的技术,但如果
getTool
不做任何其他事情,您可以取消该函数调用。不,
function PointerTool
window.PointerTool=function
:第一个是函数声明,第二个是函数表达式。是的,但在这个问题的上下文中,它足够相等了。也就是说,您可以使用
window.PointerTool
引用
PointerTool
,这就是这个答案的要点。