首页 > 解决方案 > 使用 Javascript ES5 创建自定义错误

问题描述

我正在阅读Mozilla的网络文档中关于如何在 Javascript 中扩展内置错误的以下片段。我使用 ES5 是因为我在使用 ES6 语法时遇到了问题。

我不明白的是:有"Code Chunk C"必要吗?

"Code Chunk B"将 CustomError 的原型设置为一个对象,其 (1) 原型将是Error.prototype并且 (2) 将具有名为 的constructor属性Error

在下面的代码块("Code Chunk C")中Object.setPrototypeOf,根据我的理解,将设置原型CustomErrorError。这很令人困惑,我们不是只是将原型设置为Error.prototype吗?我在有和没有这个代码块的情况下测试了代码,在这两种情况下,结果都是正确的:

const error = CustomError()

error.__proto__ === BaseError.prototype // True

error.__proto__.__proto__ === Error.prototype // True

这不是我所期望的,因为我没想到Error.prototype会和Error.

有人可以回答以下问题:

1)"Code Chunk C"如果首先运行是否有必要"Code Chunk B"?2)鉴于我之前解释过的困惑"Code Chunk B",如何做同样的事情?"Code Chunk C"

提前致谢!

// Start: Code Chunk A
function CustomError(foo, message, fileName, lineNumber) {
  var instance = new Error(message, fileName, lineNumber);
  instance.foo = foo;
  Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
  if (Error.captureStackTrace) {
    Error.captureStackTrace(instance, CustomError);
  }
  return instance;
}
// End: Code Chunk A

// Start: Code Chunk B
CustomError.prototype = Object.create(Error.prototype, {
  constructor: {
    value: Error,
    enumerable: false,
    writable: true,
    configurable: true
  }
});
// End: Code Chunk B

// Start: Code Chunk C
// Is the following necessary?
if (Object.setPrototypeOf){
  Object.setPrototypeOf(CustomError, Error);
} else {
  CustomError.__proto__ = Error;
}
// End: Code Chunk C

标签: javascriptecmascript-5

解决方案


推荐阅读