我在构造函数中看到过这样的模式:
function Animal(name) {
if ( !(this instanceof Animal) ) {
return new Animal(name);
}
this.name = name;
}
或更一般的形式:
function Animal(name) {
if ( !(this instanceof arguments.callee) ) {
return new arguments.callee(name);
}
this.name = name;
}
因此如果错误地在没有Animal()
关键字的情况下调用new
,那么它仍然可以通过在代码中调用new Animal(name)
来运行。但我想知道为什么容忍糟糕的调用代码?以下不是更理想吗?
function Animal(name) {
if ( !(this instanceof Animal) ) {
// throw an exception, alert, or console.log or console.error
}
this.name = name;
}
这样程序员就可以立即纠正调用代码。
但我想知道每种方法,如果
一种方法可能是使用JSLint?但是,如果代码已经在JSLint中显示了几千行和许多警告,并且我们目前无法正确修复所有警告,那么当前实现构造函数的好方法是什么呢?
答案 0 :(得分:1)
当一个new
关键字遍布整个地方时,我讨厌它。通过遵循标准约定,我的所有类名都以大写字符开头,以区别于常规函数。
jQuery广泛使用它们的所有构造函数(例如Event
)
我认为它可以提供更优雅的代码。
P.S。请勿使用arguments.callee
。它已被弃用。
答案 1 :(得分:1)
真正的问题似乎是应该如何处理未使用new
调用的构造函数。有明显的答案:
为ECMAScript ed 3编写,但使用严格模式进行开发,以便立即捕获大多数(但不一定是所有)此类错误。现在为网络编写的大多数代码都应该以严格和非严格模式运行。
使用彻底的单元测试
使用linter
在我看来,如果代码通过测试,构造函数返回的对象实际上是全局对象而不是实例,那么测试就是垃圾,或者构造函数不应该首先使用。
在绝大多数情况下,无论如何都不需要在javascript中使用构造函数。