javascript - Javascript中没有用new调用构造函数时如何处理?

标签 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...如果程序员没有打开控制台怎么办?然后错误可能会溜走并被推送到生产服务器。

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

最佳答案

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

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

  2. 使用彻底的单元测试

  3. 使用 linter

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

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

关于javascript - Javascript中没有用new调用构造函数时如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337525/

相关文章:

javascript - PDF JavaScript 问题

javascript - "Draw"在 HTML 和 Javascript 中的图像之上

javascript - 使用 .map 一个接一个地渲染多个状态

javascript - 在 webpack 4 中导入图像

javascript - Rails : Remote Form in a Partial: works once , 不是两次

javascript - AngularJS - 从 url 获取网站内容 (GET)

javascript - 使用 JavaScript 或 CSS 检测比例设置 (dpi)

javascript - "Uncaught TypeError: Cannot use ' 在 ' operator "使用值 $(this)

javascript - 我怎样才能在我的javascript中获得以KM为单位的总距离

javascript - InnerHTML 更改适用于 Firefox,但不适用于 IE 9