【问题标题】:What should a JavaScript constructor return if it fails?如果 JavaScript 构造函数失败,它应该返回什么?
【发布时间】:2011-07-06 04:44:25
【问题描述】:

如果我有一个无法实例化的 javascript 类,构造函数应该返回什么我可以测试。构造函数总是返回一个对象,所以如果构造函数失败,我不能返回 null。

function SomeClass(id) {
  if(typeof(id) === 'number' {
    // This is good
    this.id = id;
  } else {
    // This is bad
    // This return is ignored and an empty object is returned
    return null;
  }
}

var a = new SomeClass('badParam');
if(a){
  // is true even though the class expects a number.
}

// Could use this check
if(a.id !== undefined){
  // Do some stuff
}

但似乎应该有更好的方法。

【问题讨论】:

  • 我会返回 undefined

标签: javascript class constructor


【解决方案1】:

最好抛出异常来通知调用者初始化失败并采取适当的措施。

返回码很好,但在大多数情况下,调用者没有动机对返回码进行检查。

我的建议是努力打破并尽快打破。这将使合同违规在测试期间非常明显。

【讨论】:

    【解决方案2】:

    从构造函数返回任何非对象实际上与退出构造函数相同。 (构造函数将返回一个新对象,如果指定了 prototype。)

    因此,从构造函数返回nullundefined42 是等效的。

    查看ECMAScript spec (pdf) 的第 13.2.2 节了解更多信息。

    【讨论】:

    • ECMAScript 规范自此响应以来已更改,第 13.2.2 节不再与此对话相关。
    【解决方案3】:

    我的第一种方法:

    1. 不允许构造函数失败;考虑替代方案

    我的第二种方法:

    1. 如果构造函数失败,它只能因为编程错误而失败,因此;
    2. 应该抛出异常并且;
    3. 不得返回“状态代码”(请参阅 Emmett 的回答,了解为什么返回 null 无论如何都不起作用)

    我从未设计过构造函数(作为new 的目标调用)来返回除“预期”类型的对象之外的任何内容。

    快速失败,避免过于聪明,并节省调试难以发现的错误的时间。

    编码愉快。

    【讨论】:

      【解决方案4】:

      使用 I 哨兵。我喜欢

      return {invalid:true};
      

      这看起来很干净:

      var x = new X();
      if (x.invalid) { // ...
      

      (无法从构造函数返回非真值,因此您不能像使用其他语言那样将 new 放在条件中。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-03
        • 2011-03-21
        • 2012-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多