为什么instanceof对于Javascript中的子对象返回false

时间:2018-07-08 06:56:20

标签: javascript typescript oop inheritance instanceof

我有扩展父类的Child类。 因此,可以说我从Child类中创建了一个新实例“ child”。 当我检查条件child instanceof Child时,它返回false。 但是,child instanceof Parent返回true。

为什么这样做?

编辑

因此,我发现只有在将Child类扩展为Error类时才会发生这种情况。 让我在下面留下代码示例。

class Child extends Error {
  constructor(message) {
    super(message);
  }
}
const ch = new Child();
console.log(ch instanceof Child);

第二次编辑

class PullCreditError extends Error {
  public name: string;
  public message: string;
  public attemptsRemaining: number;
  constructor(message: string, attemptsRemaining: number) {
    super();
    Error.captureStackTrace(this, PullCreditError);
    this.name = 'PullCreditError';
    this.message = message;
    this.attemptsRemaining = attemptsRemaining;
  }
}

1 个答案:

答案 0 :(得分:1)

这是一个已记录的错误:

https://github.com/Microsoft/TypeScript/issues/15875

  

扩展内置错误,数组和映射之类的功能可能不再起作用

     

用super(...)调用返回的值代替this的值时,将Error,Array和其他类子类化可能不再按预期工作。这是由于Error,Array等的构造函数使用ECMAScript 6的new.target来调整原型链的事实。但是,在ECMAScript 5中调用构造函数时,无法确保new.target的值。默认情况下,其他下层编译器通常具有相同的限制。

建议在构造函数中使用setPrototypeOf手动调整原型。您的PullCreditError类的修复如下所示:

export class PullCreditError extends Error {
  public name: string;
  public message: string;
  public attemptsRemaining: number;
  constructor(message: string, attemptsRemaining: number) {
    super();
    Object.setPrototypeOf(this, PullCreditError.prototype); // <-------
    Error.captureStackTrace(this, PullCreditError);
    this.name = 'PullCreditError';
    this.message = message;
    this.attemptsRemaining = attemptsRemaining;
  }
}