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)
虽然这确实完成了工作,但我想知道是否有更好,更清晰的写作方式.
你是对的,过度if..then或switch逻辑是一种代码气味,几乎总能被重构为更优雅的东西.在这种情况下,基于名称的工厂可以重构为字典,其中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)
编辑:createElement方法中的那一行可以/应该首先检查是否为TYPES.*传入的内容配置了一些东西.一种好方法是在尝试调用该方法之前检查字典中是否有元素.
return (typeof dictionary[name] == 'function') ? new dictionary[name](data) : some_default_value;
Run Code Online (Sandbox Code Playgroud)