在Solid的NodeJS实现中,我可以看到以下内容:
module.exports = HTTPError
function HTTPError (status, message) {
if (!(this instanceof HTTPError)) {
return new HTTPError(status, message)
}
这背后的意义是什么?在哪种情况下,方法实例不会通过instanceof
检查?我认为这并不是我现在想的那样多余,但是找不到背后的逻辑。
答案 0 :(得分:2)
根据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);
答案 1 :(得分:1)
this instanceof HTTPError
检查的目的是允许将该类作为常规函数进行调用。 HTTPError
类模仿Error
之类的内置JavaScript类,可以在有和没有new
的情况下构造它们:
Error() instanceof Error; // true
HTTPError() instanceof HTTPError; // true
答案 2 :(得分:1)
这允许两个调用都可以作为类实例:
let myError = new HTTPError('status', 'message');
并作为函数调用:
let myError = HTTPError('status', 'message');
在函数调用的情况下,在函数主体中未定义this
,因此,返回new HTTPError
将创建该类的实例。