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

时间:2010-12-05 19:25:22

标签: javascript dynamic

如何基于变量类型字符串(包含对象的名称)在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);
}

我想获得(不断增长的)开关声明,似乎'错了'。

3 个答案:

答案 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.SelectToolnew 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]();
}

这种方法可以防止你的东西与全局/窗口范围内定义的其他内容隔离开来。