【问题标题】:instanceOf returns false although debugger shows the object尽管调试器显示了对象,但 instanceOf 返回 false
【发布时间】:2016-06-08 18:59:52
【问题描述】:

我有这个简单的函数应该返回 true

虽然我返回 false,但控制台调试器显示这是 UIError 对象。尽管如此:

exception.originalException instanceOf UIError

返回假!我在调试器中看到它确实是一个 UIError 类。为什么?

UIError 扩展了错误类

private isAnUIError(exception: any): boolean {
    return (exception.originalException) instanceof UIError || exception instanceof  UIError;
}

export class UIError extends Error {
constructor (private message: string) {
super();
this.message = message;
 }

【问题讨论】:

  • 什么是UIError
  • 不确定,可能是 the UIError class 本身?试试exception.originalException == UIError。或者,至少exception.originalException instanceof Error 有效吗?
  • UIError 扩展错误
  • exception.originalException instanceOf Error 返回 true,但我不希望这样。我只想捕获 UIError 对象
  • @adamnowak 您能否发布您的代码以允许我们重现此内容,而不是显示漂亮的调试器图片?请注意,调试器中对象的“名称”(或“类名”)可能会产生误导,尤其是在多帧环境中。

标签: javascript inheritance typescript prototype


【解决方案1】:

如果 typescript 类似于 Babel ES6 Error 就不能像普通类那样扩展。这是 JavaScript 中令人讨厌的缺陷。解决方法是直接管理新错误的原型。我在another SO Answer 中解释了这个关于 ES6 和 Babel 的转译。

这是我期望的样子:

class UIError {
  constructor(message) {
    this.name = 'UIError';
    this.message = message;
    this.stack = new Error().stack; // Optional
  }
}
UIError.prototype = Object.create(Error.prototype);

请记住,super()Error 没有任何作用,因为Error 不是典型的构造函数(类)。这意味着没有什么可以执行的

Error.apply(this, [].slice.call(arguments, 0))

(这基本上是 super() 所做的)因为 Error() 函数对 this 没有任何作用,而是返回一个新错误。这是关于 JavaScript 中 Error 的一个已知警告。

【讨论】:

  • 您需要区分 ES5 Error 实现和 ES6 实现。
  • 我试过你的方法,但得到:“TypeError:无法分配给函数'class MyError'的只读属性'prototype'”
  • @rinderonthestorm 我认为 babel 正在转型。要修复您的错误,请不要使用 class 并返回 function。我还认为较新版本的 babel 将允许按预期扩展 Error。不确定。
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多