Создание JavaScript-объекта - PullRequest
       3

Создание JavaScript-объекта

7 голосов
/ 23 августа 2011

JavaScript новичок здесь, я проходил некоторый js-код на работе, когда натолкнулся на вспомогательную функцию для создания объекта, которая выглядела так:

createElement = function(name, data){
    if(name == TYPES.TEXT){
    return new Text(data);
    }
    else if(name == TYPES.WORD){
    return new Word(data);
    }
    else if(name == TYPES.PARAGRAPH){
    return new Paragraph(data); 
    }
    else if(name == TYPES.TABLE){
    return new Table(data);
    }
    <list goes on and on and on... >
}

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

Ответы [ 2 ]

9 голосов
/ 23 августа 2011

Вы правы, чрезмерная логика if..then или switch - это запах кода , и ее почти всегда можно превратить в нечто более элегантное.В этом случае фабрика, основанная на имени, может быть преобразована в словарь с ключом в качестве этого имени и значением в качестве функции для возврата

var dictionary = {};
dictionary[TYPES.TEXT] = Text;
dictionary[TYPES.WORD] = Word;
dictionary[TYPES.PARAGRAPH] = Paragraph;
dictionary[TYPES.TABLE] = Table;

createElement = function(name, data){
    return new dictionary[name](data);
}

Живой пример: http://jsfiddle.net/KkMnd/

РЕДАКТИРОВАТЬ: Эта строка в методе createElement может / должна сначала проверить, что что-то сконфигурировано для переданного TYPES.*. Хороший способ - проверить, есть ли элемент в словаре перед попыткой вызоваэтот метод.

return (typeof dictionary[name] == 'function') ? new dictionary[name](data) : some_default_value;
0 голосов
/ 23 августа 2011

Было бы немного чище, но семантически то же самое, если использовать оператор switch.

function createElement(name,data){
switch(name)
{
case TYPES.TEXT:
  return new Text(data)
  break;
case TYPES.WORD:
  return new WORD(data)
  break;
default:
  // etc. code to be executed if no values match
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...