如果在Javascript中没有使用new调用构造函数时如何处理它?

时间:2012-11-12 02:06:04

标签: javascript

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

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. 如果是警报,如果它处于运行一千次的循环中,并且浏览器无法让用户选择不再显示警报,那么警报将弹出一千次。
  3. console.log或console.error ...如果程序员没有打开控制台怎么办?然后,bug可能会滑过并被推送到生产服务器。
  4. 一种方法可能是使用JSLint?但是,如果代码已经在JSLint中显示了几千行和许多警告,并且我们目前无法正确修复所有警告,那么当前实现构造函数的好方法是什么呢?

2 个答案:

答案 0 :(得分:1)

当一个new关键字遍布整个地方时,我讨厌它。通过遵循标准约定,我的所有类名都以大写字符开头,以区别于常规函数。

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


P.S。请勿使用arguments.callee。它已被弃用。

答案 1 :(得分:1)

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

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

  2. 使用彻底的单元测试

  3. 使用linter

  4. 在我看来,如果代码通过测试,构造函数返回的对象实际上是全局对象而不是实例,那么测试就是垃圾,或者构造函数不应该首先使用。

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