JavaScript对象创建

时间:2011-08-23 11:44:40

标签: javascript object helper

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 个答案:

答案 0 :(得分:9)

你是对的,过多的if..thenswitch逻辑是code smell,并且几乎总能被重构为更优雅的东西。在这种情况下,基于名称的工厂可以重构为字典,其中key作为名称,值作为返回函数

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;

答案 1 :(得分:0)

使用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
}
}