JavaScript对象创建

kar*_*hik 7 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... >
}
Run Code Online (Sandbox Code Playgroud)

虽然这确实完成了工作,但我想知道是否有更好,更清晰的写作方式.

Jam*_*iec 9

你是对的,过度if..thenswitch逻辑是一种代码气味,几乎总能被重构为更优雅的东西.在这种情况下,基于名称的工厂可以重构为字典,其中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);
}
Run Code Online (Sandbox Code Playgroud)

实例:http://jsfiddle.net/KkMnd/

编辑:createElement方法中的那一行可以/应该首先检查是否为TYPES.*传入的内容配置了一些东西.一种好方法是在尝试调用该方法之前检查字典中是否有元素.

return (typeof dictionary[name] == 'function') ? new dictionary[name](data) : some_default_value;
Run Code Online (Sandbox Code Playgroud)

  • +1用于简化和提及此模式的名称(工厂模式).我担心的是OP没有提到最后一个"_else_"声明,你也应该在这里实现它,例如.`return(typeof dictionary [name]!='undefined')?dictionary [name](data):something_goes_here;`(如果没有找到,只需将`something_goes_here`替换为预期的结果). (3认同)