扩展JavaScript错误/异常

gob*_*was 6 javascript inheritance native exception

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

那么,我决定以这种方式从本机Javascript Error对象继承它们(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(){...}
Run Code Online (Sandbox Code Playgroud)

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

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

我已经在这里MDN上阅读了有关此内容的文章,但所有人都说我要使用这样的东西:

var MyError = function(msg){
    this.message = msg;
};
Run Code Online (Sandbox Code Playgroud)

但我的问题是 - 如果不是在Error的构造函数中,那么消息初始化的地方?可能有人知道Error本机构造函数是如何工作的?

谢谢!

PS如果它有趣 - 我正在开发Enum.js库.

T.J*_*der 5

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

在这一行:

Error.prototype.constructor.apply(this, arguments);
Run Code Online (Sandbox Code Playgroud)

...你正在调用Error(间接)作为普通函数调用而不是作为new表达式的一部分,并且当你将其称为非构造函数时定义的行为Error是创建一个新的,空白Error并返回它(而不是比填充this).

现在,在正常情况下,您正在使用原型进行标准检查是否将其作为构造函数(if (this instanceof Error))工作.不幸的是,它似乎并没有这样做,并且无论用什么检查来确定它的调用方式似乎都没有立即服从你想要做的事情.即便如此(这只是一个测试,并不意味着你真正做过的事情):

MyError.prototype = Error.prototype; // You wouldn't normally do this, it's just a test
Run Code Online (Sandbox Code Playgroud)

......没有解决它.

这个对另一个Stack Overflow问题的回答指出了一种可能的解决方法(基本上,让我们Error创建对象,然后从中返回MyError):

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

不是令人惊讶的满足,因为你必须将你的扩展直接放在对象而不是使用原型链,但如果Error拒绝打球,你的选择有点受限......