2

我在构造函数中看到了这样的模式:

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;
}

使程序员可以立即更正调用代码。

但我想知道每种方法,如果

  1. 如果异常被捕获但只是在调用堆栈的某个级别被忽略了怎么办?
  2. 如果是alert,如果在循环运行一千次,浏览器没有办法让用户选择不再显示alert,那么alert会弹出一千次。
  3. console.log 或 console.error... 如果程序员没有打开控制台怎么办?然后错误可能会溜走并被推送到生产服务器。

一种方法可能是使用 JSLint?但是,如果代码已经有几千行并且在 JSLint 中显示了许多警告,而我们目前无法修复所有警告,那么目前有什么好的方法可以很好地实现构造函数呢?

4

2 回答 2

1

new当关键字到处都是时,我讨厌它。按照标准约定,我所有的类名都以大写字符开头,以区别于常规函数。

jQuery 广泛地使用它们的所有构造函数(例如Event)。
我认为它使代码更加优雅。


PS不要使用arguments.callee. 它已被弃用。

于 2012-11-12T02:18:27.213 回答
1

真正的问题似乎是如何处理不new应该调用的构造函数。有明显的答案:

  1. 为 ECMAScript ed 3 编写,但使用严格模式进行开发,以便立即捕获大多数(但不一定是全部)此类错误。大多数为 Web 编写的代码现在应该在严格模式和非严格模式下运行。

  2. 使用彻底的单元测试

  3. 使用棉绒

在我看来,如果代码通过了测试,其中构造函数返回的对象实际上是全局对象而不是实例,那么测试要么是垃圾,要么一开始就不应该使用构造函数。

在绝大多数情况下,无论如何都不需要在 javascript 中使用构造函数。

于 2012-11-12T03:10:36.690 回答