【问题标题】:Extending JavaScript errors / exceptions扩展 JavaScript 错误/异常
【发布时间】:2023-03-16 03:59:01
【问题描述】:

我正在开发一个小型 JS 库,并在那里使用自定义错误异常。

所以,我决定以这种方式从原生 Javascript 错误对象继承它们(ORLY?):

var MyError = function(){
    Error.prototype.constructor.apply(this, arguments);
};

// Inherit without instantiating Error
var Surrogate = function(){};
Surrogate.prototype = Error.prototype;
MyError.prototype = new Surrogate();

// Add some original methods
MyError.prototype.uniqueMethod = function(){...}

看起来像通常的继承.. 但是!

var err = new MyError("hello! this is text!");
console.log(err.message); // is giving me empty string!

我已经阅读了关于 hereMDN 的文章,但他们都说我要使用这样的东西:

var MyError = function(msg){
    this.message = msg;
};

但我的问题是——如果不在Error的构造函数中,那么消息在哪里初始化? 可能有人知道错误原生构造函数是如何工作的?

谢谢!

附:如果有趣的话 - 我正在开发 Enum.js 库。

【问题讨论】:

  • 让它尽可能简单:var obj = new Error(); Error.call(obj, "Hello, world!"); 这也不起作用。 Error 很奇怪。
  • @minitech: "Error 很奇怪。" +1

标签: javascript exception inheritance native


【解决方案1】:

你正在做的很好。 Error 这就是问题所在。

在这一行:

Error.prototype.constructor.apply(this, arguments);

...您调用Error(间接)作为普通函数调用,而不是作为new 表达式的一部分,defined behavior for Error when you call it as a non-constructor function 是创建一个新的空白Error 并返回它(而不是填充this)。

现在,在正常情况下,您对原型所做的操作将使标准检查它是否被称为构造函数 (if (this instanceof Error)) 工作。不幸的是,它似乎并没有这样做,而且它用来确定它是如何被调用的任何检查似乎都不能立即适应你想要做的事情。即使这样(这只是一个测试,并不意味着你会真正做):

MyError.prototype = Error.prototype; // You wouldn't normally do this, it's just a test

...没解决。

This answer to another Stack Overflow question 指向一个可能的解决方法(基本上,让Error 创建对象,然后从MyError 返回):

function MyError(message) {
    var e = new Error(message);
    // ...apply your enhancements to `e`
    return e;
}

由于您必须将扩展直接放在对象上而不是使用原型链,这并不令人满意,但是如果 Error 拒绝玩球,您的选择会有点有限...

【讨论】:

  • 感谢您的回答。所以,似乎我需要像这样:`MyError = function(msg){ var err = new Error(); this.msg = 味精; this.stack = err.stack; ...}
  • @gobwas:我刚刚用一种可能的解决方法更新了答案。我不喜欢它,但我不确定你有很多选择。 编辑或者,是的,你可以这样做。
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 2013-06-12
  • 1970-01-01
  • 2015-11-10
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多