Как объект ошибки захватывает стек, думая, что я не передаю это в аргументе

1

Я создал собственный объект ошибки, простирающийся от Error и бросил его только с сообщением в качестве параметра в конструктор и вызвал супер в конструкторе без каких-либо параметров. Как работает err.stack?

class MyError extends Error {
 constructor(message,err) {
    super();
    this.name = this.constructor.name;
    this.cause = err
 }
}

Я могу получить стек, хотя я не передаю его супер.

try { 
     if(i > 6 ) { 
       throw new MyError('greater than 6'); 
     } 
} catch(err) { 
   if(err instanceof MyError) {
     console.log(err.stack);  // how is err.stack working...??
   }
}
  • 1
    MyError наследует поле, которое само инициализируется в super ()?
  • 1
    err.stack становится доступным через наследование прототипов - независимо от конструкции class . Это так просто.
Показать ещё 1 комментарий
Теги:

1 ответ

0

stack является частью Error.prototype, который включается в MyError при расширении стандартной Error. Это реальное наследование, используемое в JS. Что происходит за кулисами, это что-то вроде:

MyError.prototype = Object.create(Error.prototype);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню