Чтобы вызывать ошибки в наших приложениях JavaScript, мы обычно используем объект, являющийся экземпляром конструктора Error
.
В этой статье мы рассмотрим, как расширить конструктор JavaScript Error
нашим собственным конструктором.
Создайте нашу собственную функцию-конструктор
Один из способов расширить встроенный конструктор Error
- создать собственный конструктор, который получает данные из конструктора Error
.
Например, мы можем написать:
function MyError(message) { this.name = 'MyError'; this.message = message; this.stack = (new Error()).stack; } MyError.prototype = new Error(); throw new MyError('error occurred')
Мы создаем конструктор MyError
, который принимает параметр message
.
Мы устанавливаем message
как значение свойства message
.
И мы получаем трассировку стека из свойства stack
экземпляра Error
.
Мы устанавливаем MyError.prototype
на новый экземпляр Error
, так что экземпляр MyError
также является экземпляром Error
.
В конструкторе мы устанавливаем name
, который будет регистрироваться при возникновении ошибки.
Затем мы бросаем экземпляр MyError
с ключевым словом throw
.
Как только ошибка будет выдана, мы должны увидеть ее в журнале.
И если мы log myError instanceof Error
и myError instanceof MyError
, мы должны увидеть, что оба true
, поскольку мы устанавливаем MyError.prototype
на новый Error
экземпляр.
Используйте синтаксис класса и расширяет ключевое слово для расширения конструктора ошибок
Синтаксис класса добавлен в ES6, чтобы мы могли легко создавать конструкторы, которые наследуют конструкторы.
Однако под синтаксическим сахаром все еще используется прототипное наследование, как в предыдущем примере.
Чтобы расширить конструктор Error
, мы пишем:
class MyError extends Error { constructor(message) { super(message); this.name = 'MyError'; } } const myError = new MyError('error occurred') console.log(myError instanceof Error) console.log(myError instanceof MyError) throw myError
Мы создаем класс MyError
с ключевым словом extends
, чтобы создать подкласс класса Error
.
constructor
принимает параметр message
, и мы передаем его в конструктор Error
, вызывая super
.
Мы также устанавливаем в конструкторе собственное свойство name
.
А затем мы создаем экземпляр класса MyError
так же, как и раньше.
И если мы используем оператор instanceof
для Error
и MyError
, мы увидим, что они оба true
.
Когда мы выдаем ошибку, мы видим сообщение, как и раньше.
Заключение
Мы можем использовать обычное прототипное наследование или синтаксис класса, чтобы создать собственный конструктор, который наследует данные от конструктора Error
.
Больше контента на plainenglish.io