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

oen*_*lli 38 javascript constructor class

如果我有一个无法实例化的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
}
Run Code Online (Sandbox Code Playgroud)

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

Sla*_*ppy 36

最好抛出异常以通知调用者初始化失败并采取适当的操作.

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

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


Emm*_*ett 28

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

因此,返回null,undefined42来自构造函数是等效的.

有关详细信息,请查看ECMAScript规范(pdf)的第13.2.2节.

  • 自此响应以来,ECMAScript规范已更改,第13.2.2节不再与此对话相关. (2认同)

小智 13

我的第一个方法:

  1. 不要让构造函数失败; 考虑替代品

我的第二种方法:

  1. 如果构造函数失败,它必须仅因编程错误而失败;
  2. 应该抛出一个例外 ;
  3. 不能返回'状态代码'(参见Emmett的回答,为什么返回null不起作用)

我从来没有设计过构造函数(作为目标调用的东西new)来返回除"expected"类型的对象之外的任何东西.

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

快乐的编码.


小智 5

使用我哨兵。我喜欢

return {invalid:true};
Run Code Online (Sandbox Code Playgroud)

这看起来很干净:

var x = new X();
if (x.invalid) { // ...
Run Code Online (Sandbox Code Playgroud)

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