如果JavaScript构造函数失败,它应该返回什么?

时间:2011-03-01 01:37:52

标签: javascript class constructor

如果我有一个无法实例化的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
}

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

4 个答案:

答案 0 :(得分:35)

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

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

我的建议是尽快打破并打破。这将使合同违规在测试过程中非常明显。

答案 1 :(得分:26)

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

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

查看ECMAScript spec (pdf)的第13.2.2节以获取更多信息。

答案 2 :(得分:12)

我的第一个方法:

  1. 不允许构造函数失败;考虑替代方案
  2. 我的第二种方法:

    1. 如果构造函数失败,它必须仅因编程错误而失败,因此;
    2. 应该抛出异常和;
    3. 不得返回“状态代码”(请参阅Emmett的回答,了解为什么返回null无法正常工作)
    4. 我从来没有设计过一个构造函数(作为new的目标调用的东西)来返回除“expected”类型的对象之外的任何东西。

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

      快乐的编码。

答案 3 :(得分:3)

使用我的哨兵。我喜欢

return {invalid:true};

看起来很干净:

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

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