简单的解决方法:工作小提琴
function ErrorChild(name, message) {
// Error.call(this); this is not needed
this.name = name;
this.message = message;
}
ErrorChild.prototype = Object.create(Error.prototype);
ErrorChild.prototype.constructor = ErrorChild;
var myerror = new ErrorChild("test", "Help!");
document.body.innerHTML += myerror.message;
以上并没有破坏预期的行为。当你throw myerror
,正确的name
和message
将显示。
问题
来自 ECMA5 语言规范:
15.11.1 作为函数调用的错误构造函数
当 Error 作为函数而不是构造函数调用时,它会创建并初始化一个新的 Error 对象。因此,函数调用 Error(...) 等效于具有相同参数的对象创建表达式 new Error(...)。
问题:Error.call(this)
, 等价于new Error
。但是new Error
实例化不会设置name
or message
。将默认new Error
初始化。message
""
15.11.4.3 Error.prototype.message # Ⓣ Ⓡ Error.prototype.message 的初始值为空字符串。
测试(证明)
如果在您ErrorChild
的内部,您要添加:
var test = Error.call(this, message);
console.dir(test);
console.log(test instanceof Error); // true;
console.log(test.message); // "Help!";
这test
反映了 ECMA5 规范。Error
具有适当message
集合的实例。
结论:
因为Error.call(arguments);
自动转换为new Error(arguments);
范围会丢失,所以永远不会在this
对象上初始化属性。
使用时Object.create(Error.prototype)
,该message
属性采用默认值,即空字符串。