将类型分配给变量时的ES6 instanceof

ES6 instanceof when assigning a type to a variable

const Namespace = {
  "FooFunction": () => {
    class MyError extends Error {
      constructor(message) {
        super(message);
      }
    }
    return {"MyError": MyError};
  }
}

console.log((new (Namespace.FooFunction()).MyError("foo")) instanceof Namespace.FooFunction().MyError);

这会打印出错误。我正在寻找一种方法来对像这样的“存储在变量中的类型”使用 instanceof。我该怎么做 - 这可能吗?

每次调用 Namespace.FooFunction,它都会创建一个新的 MyError class,因此 Namespace.FooFunction().MyError == Namespace.FooFunction().MyError 永远不会为真。

如果您需要在函数中保留 MyError class 声明,尽可能少地更改,我们可以将 FooFunction 转换为 IIFE,这允许每次调用时 return 相同 MyError class:

const Namespace = {
  "FooFunction": (() => {
    class MyError extends Error {
      constructor(message) {
        super(message);
      }
    }
    return (...arguments) => ({"MyError": MyError});
  })()
}

console.log((new (Namespace.FooFunction()).MyError("foo")) instanceof Namespace.FooFunction().MyError);

当然,更好的选择是将 class 添加到 Namespace 对象本身:

const Namespace = {
  "MyError": class MyError extends Error {
    constructor(message) {
      super(message);
    }
  },
  "FooFunction": function() {
    return {"MyError": this.MyError};
  }
}

console.log((new (Namespace.FooFunction()).MyError("foo")) instanceof Namespace.FooFunction().MyError);