javascript - 为什么需要将构造函数分配回我在 JavaScript 中的自定义错误类型

标签 javascript error-handling

<分区>

我正在学习“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

现在上面的代码可以工作了!

希望这对某人有所帮助...我也学到了一些东西!

关于javascript - 为什么需要将构造函数分配回我在 JavaScript 中的自定义错误类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47669783/

相关文章:

python - 错误-IndentationError : unindent does not match any outer indentation level

javascript - vscode : rearrange code for js/ts files

javascript - 这个 JavaScript 三元运算符是如何工作的

javascript - 为什么我的坦克没有出现?

spring-boot - Spring Boot @ResponseStatus 不返回 HTTP 消息

python - nhlscrapi-下载数据错误

javascript - 使用 setRouteLeaveHook 通过自定义对话框确认导航

ASP.NET、Visual Studio、C# 和 Javascript

php - 我可以检测是否使用错误控制运算符 (@) 调用了函数吗?

javascript - 如何将 tabBarOption 添加到下面的代码中?这样我就可以使用 tintColor