如何基于变量类型字符串(包含对象的名称)在javascript中创建新对象?
现在我已经:(随着更多工具的到来,列表会变得更长......)
function getTool(name){
switch(name){
case "SelectTool":
return new SelectTool();
break;
case "LineTool":
return new LineTool();
break;
case "BlurTool":
return new BlurTool();
break;
case "PointerTool":
default:
return new PointerTool();
break;
}
}
并定义了我的工具:
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);
}
我想获得(不断增长的)开关声明,似乎'错了'。
答案 0 :(得分:18)
function getTool(name){
return ( typeof window[name] === 'function' ) ?
new window[name]() : {/*some default*/};
}
假设PointerTool
构造函数在全局window
命名空间中定义。用您正在使用的任何名称空间替换它。
答案 1 :(得分:8)
您应该考虑重新考虑您的方法。最好有一个类似Tools
对象的东西,它可以将工具作为属性,比如
Tools = {"SelectTool": SelectTool /* etc */}`.
这样,您就可以new Tools.SelectTool
和new Tools[var_with_tool_name]
访问这些工具。
答案 2 :(得分:3)
在您的示例中,您将PointerTool
声明为全局范围内的函数。假设您的javascript正在运行浏览器,“全局范围”实际上与window
对象相同。这意味着如果你有一个构造函数:
function PointerTool() {
...
}
与此相同:
window.PointerTool = function() {
...
}
现在,在getTool函数中,您可以访问构造函数,如下所示:
function getTool(name){
return new window[name]();
}
更加“未来证明”的方法是定义自己的命名空间对象,在其中放置所有各种工具构造函数。像这样的东西(“myproject”将是你的项目或系统的简称):
var myproject = { tools: {} };
// Pointer Tool Constructor
myproject.tools.PointerTool = function() {
...
}
// Line Tool Constructor
myproject.tools.LineTool = function() {
...
}
// and so on
然后你的getTool函数看起来像这样:
function getTool(name){
return new myproject.tools[name]();
}
这种方法可以防止你的东西与全局/窗口范围内定义的其他内容隔离开来。