Я создал собственный объект ошибки, простирающийся от 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...??
}
}
stack
является частью Error.prototype
, который включается в MyError
при расширении стандартной Error
. Это реальное наследование, используемое в JS. Что происходит за кулисами, это что-то вроде:
MyError.prototype = Object.create(Error.prototype);
err.stack
становится доступным через наследование прототипов - независимо от конструкцииclass
. Это так просто.