Почему instanceof возвращает false для дочернего объекта в Javascript

У меня есть класс 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);

2nd EDIT

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;
  }
}

javascript,typescript,oop,inheritance,instanceof,

1

Ответов: 1


1 принят

Это документированная ошибка:

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

Расширение встроенных функций, таких как Ошибка, Массив и Карта, может больше не работать

В качестве подстановки значения этого значения, возвращаемого вызовом super (...), подклассификация Error, Array и другие могут работать не так, как ожидалось. Это связано с тем, что функции конструктора для Error, Array и т. Д. Используют new.target ECMAScript 6 для настройки цепи прототипа; однако нет способа гарантировать значение new.target при вызове конструктора в ECMAScript 5. Другие компиляторы нижнего уровня обычно имеют одинаковое ограничение по умолчанию.

Рекомендация заключается в том, чтобы вручную настроить прототип 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;
  }
}
JavaScript, машинопись, OOP, наследование, InstanceOf,
Похожие вопросы