【问题标题】:JavaScript/NodeJS: checking instanceof for parent methodJavaScript/NodeJS:检查 instanceof 的父方法
【发布时间】:2018-10-30 09:06:22
【问题描述】:
在 Solid 的 NodeJS 实现中,我可以看到以下内容:
module.exports = HTTPError
function HTTPError (status, message) {
if (!(this instanceof HTTPError)) {
return new HTTPError(status, message)
}
这背后的意义何在?在哪种情况下所说的方法实例不会通过instanceof 检查?我认为这不是多余的,正如我现在所想的那样,但找不到它背后的逻辑。
Link to mentioned code on GitHub
【问题讨论】:
标签:
javascript
node.js
instanceof
【解决方案1】:
差异取决于new 关键字的存在。
考虑以下示例:
function HTTPError(status, message) {
if (!(this instanceof HTTPError)) {
console.log("called without new. Status is " + status);
return new HTTPError(status, message)
} else {
console.log("called with new. Status is " + status);
}
this.status = status;
}
const i = HTTPError(500);
const i2 = new HTTPError(400);
console.log(i);
console.log(i2);
【解决方案2】:
this instanceof HTTPError 检查的目的是允许类作为常规函数调用。 HTTPError 类模仿内置的 JavaScript 类,如 Error,可以在有和没有 new 的情况下构造:
Error() instanceof Error; // true
HTTPError() instanceof HTTPError; // true
【解决方案3】:
这使得两个调用都成为可能,作为一个类实例:
let myError = new HTTPError('status', 'message');
作为函数调用:
let myError = HTTPError('status', 'message');
在函数调用的情况下,this 在函数体中是未定义的,因此,返回new HTTPError 将创建该类的实例。