【问题标题】:JavaScript object creationJavaScript 对象创建
【发布时间】:2011-11-01 21:29:08
【问题描述】:

这里是 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... >
}

虽然这确实完成了工作,但我想知道是否有更好、更简洁的方式来编写这个。

【问题讨论】:

标签: javascript object helper


【解决方案1】:

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

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 这个解决方案的额外好处是,如果您的 TYPES 需要扩展,您无需更改任何 逻辑 即可,您必须使用switch
  • +1 用于简化和提及此模式(工厂模式)的名称。我担心的是OP没有提到最后一个“else”语句,你也应该在这里实现它,例如。 return (typeof dictionary[name] != 'undefined') ? dictionary[name](data) : something_goes_here;(如果没有找到,只需将 something_goes_here 替换为预期结果)。
  • @Tadeck - 我认为这是一个非常好的建议,但是出于两个原因,我不会将其编辑为答案。 a) 他的name 参数似乎是一种伪枚举类型的对象。我假设这些足够安全,没有人会传入随机字符串。b)它使解决方案复杂到足以使其混乱。但是为了 OP 的缘故......您可能希望将该检查放入您的真实代码中。
  • 谢谢杰米克。使用字典看起来更干净。 @Tadeck 假设可以通过这种方式捕获最后一个 else .. return dictionary[name] || default_case
  • @Tadeck 对不起.. 知道回车键会提交评论。我只是想确保这是处理默认案例返回字典[名称](数据)||的好方法default_object
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2012-11-20
    • 2012-03-06
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多