【问题标题】: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 将创建该类的实例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-14
          • 1970-01-01
          • 2015-10-23
          • 2015-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多