Как мне создать новый объект в JavaScript на основе строки типа? - PullRequest
10 голосов
/ 05 декабря 2010

Как мне создать новый объект в javascript на основе переменной type-string (содержащей имя объекта)?

Теперь у меня есть: (с появлением новых инструментов список станет длиннее ...)

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

Я бы хотел воспользоваться (растущим) оператором switch, он кажется «неправильным».

Ответы [ 3 ]

18 голосов
/ 05 декабря 2010
function getTool(name){
  return ( typeof window[name] === 'function' ) ? 
                                    new window[name]() : {/*some default*/};
}

Предполагается, что конструктор PointerTool определен в глобальном пространстве имен window. Замените его тем пространством имен, которое вы используете.

8 голосов
/ 05 декабря 2010

Вы должны подумать о переосмыслении вашего подхода. Было бы лучше иметь что-то вроде Tools объекта, который имел бы инструменты в качестве свойств, например

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

Таким образом, вы можете получить доступ к инструментам как new Tools.SelectTool и new Tools[var_with_tool_name].

3 голосов
/ 05 декабря 2010

В вашем примере вы объявляете 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]();
}

Этот подход сохраняет вашиматериал, изолированный от всего, что случается, определяется в глобальной области / области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...