JavaScript / NodeJS:检查instanceof的父方法

时间:2018-10-30 09:06:23

标签: javascript node.js instanceof

在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

3 个答案:

答案 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将创建该类的实例。