一尘不染

在JavaScript中扩展Error的好方法是什么?

spring

我想在我的JS代码中扔一些东西,我希望它们是Error的instanceof,但我也想让它们成为其他东西。

在Python中,通常将Exception子类化。

在JS中适合做些什么?


阅读 411

收藏
2020-05-02

共2个答案

一尘不染

在ES6中:

class MyError extends Error {
  constructor(message) {
    super(message);
    this.name = 'MyError';
  }
}
2020-05-02
一尘不染

message属性唯一的标准字段Error对象是。(请参阅MDN或EcmaScript语言规范,第15.11节)。其他所有内容都是特定于平台的。

Mosts环境设置stack属性,但fileNamelineNumber实际上是无用的继承使用。

因此,简约的方法是:

function MyError(message) {
    this.name = 'MyError';
    this.message = message;
    this.stack = (new Error()).stack;
}
MyError.prototype = new Error;  // <-- remove this if you do not 
                                //     want MyError to be instanceof Error

你可以嗅探堆栈,从堆栈中取消不需要的元素,并提取文件名和行号之类的信息,但是这样做需要有关当前正在运行JavaScript的平台的信息。大多数情况下都是不必要的-如果你确实需要,可以在事后检查中进行。

Safari是一个明显的例外。没有stack属性,但是有throw关键字集sourceURLline要抛出的对象的属性。这些事情肯定是正确的。

2020-05-02