我正在学习“JavaScript 中的错误处理”,并在站点点阅读文章。在文章中,它展示了制作自定义错误类型的方法:
function DivisionByZeroError(message) {
this.name = "DivisionByZeroError";
this.message = (message || "");
}
DivisionByZeroError.prototype = new Error();
DivisionByZeroError.prototype.constructor = DivisionByZeroError;
但是,我不明白为什么函数构造函数必须再次赋值给自己。也就是说,
DivisionByZeroError.prototype.constructor = DivisionByZeroError;
我认为这是因为 DivisionByZeroError.prototype
分配给了 new Error()
所以原型(prototype)被改变了。
但即使在注释掉该行之后,我也不确定为什么。该代码仍然可以正常工作。
演示代码放jsfiddle
引用:
Exceptional Exception Handling in JavaScript
A Guide to Proper Error Handling in JavaScript
这背后的原因是,如果您运行以下代码:
console.log(new Error().constructor)
它输出:
"ƒ Error() { [native code] }"
现在,按照标准,如果您创建一个类,则以下内容应该为真:
console.log(new MyClassName().constructor === MyClassName)
例如,以下是正确的:
(new Error().constructor) === Error; // true
它的用途可能是这样的:
function isArray(maybeArray) {
return maybeArray.constructor === Array;
}
isArray([]); // true
isArray(new Array(10)); // true
isArray(false); // false
// or say this function
function makeAnotherOfObjectWithoutParameters(object) {
return new object.constructor();
}
(makeAnotherOfObjectWithoutParameters([])); // empty array
现在假设您想查看一个对象是否是 DivisionByZeroError
。你有这样的功能:
function DivisionByZeroError(message) {
this.name = "DivisionByZeroError";
this.message = (message || "");
}
DivisionByZeroError.prototype = new Error();
现在,您应该期望以下内容为真:
console.log(new DivisionByZeroError('my message').constructor === DivisionByZeroError);
但是您会惊讶于它是错误的,所以现在您必须像这样显式设置构造函数:
DivisionByZeroError.prototype.constructor = DivisionByZeroError
现在上面的代码可以工作了!
希望这对某人有所帮助...我也学到了一些东西!