我在构造函数中看到了这样的模式:
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;
}
以便程序员可以立即纠正调用代码。
但我想知道对于每种方法,如果
- 如果异常被捕获但只是在调用堆栈的某个级别被忽略怎么办?
- 如果是警告,如果是在一个运行一千次的循环中,而浏览器没有办法让用户选择不再显示警告,那么警告就会弹出一千次。
- console.log 或 console.error...如果程序员没有打开控制台怎么办?然后错误可能会溜走并被推送到生产服务器。
一种方法可能是使用 JSLint?但是,如果代码已经有几千行并且 JSLint 中显示了许多警告,而我们目前无法修复所有警告,那么目前实现构造函数的好方法是什么?
最佳答案
真正的问题似乎是如何处理应该用 new
调用构造函数的情况。有明显的答案:
为 ECMAScript ed 3 编写,但使用严格模式进行开发,以便大多数(但不一定是全部)此类错误将立即捕获。现在为网络编写的大多数代码都应该在严格和非严格模式下运行。
使用彻底的单元测试
使用 linter
在我看来,如果代码通过了测试,其中构造函数返回的对象实际上是全局对象而不是实例,那么测试要么是垃圾,要么首先就不应该使用构造函数。
在绝大多数情况下,无论如何都不需要在 JavaScript 中使用构造函数。
关于javascript - Javascript中没有用new调用构造函数时如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337525/