如果我有一个无法实例化的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
}
但似乎应该有更好的方法。
答案 0 :(得分:35)
最好抛出一个异常来通知调用者初始化失败并采取适当的措施。
返回代码很好,但在大多数情况下,调用者没有动机对返回代码执行检查。
我的建议是尽快打破并打破。这将使合同违规在测试过程中非常明显。
答案 1 :(得分:26)
从构造函数返回任何非对象几乎与退出构造函数相同。 (构造函数将返回一个新对象,如果指定了一个prototype
,则返回该对象。)
因此,从构造函数返回null
,undefined
或42
是等效的。
查看ECMAScript spec (pdf)的第13.2.2节以获取更多信息。
答案 2 :(得分:12)
我的第一个方法:
我的第二种方法:
null
无法正常工作)我从来没有设计过一个构造函数(作为new
的目标调用的东西)来返回除“expected”类型的对象之外的任何东西。
快速失败,避免太聪明,并节省调试难以发现的错误的时间。
快乐的编码。
答案 3 :(得分:3)
使用我的哨兵。我喜欢
return {invalid:true};
看起来很干净:
var x = new X();
if (x.invalid) { // ...
(无法从构造函数返回非真值,因此您不能像使用其他语言那样将 new 放入条件中。)