javascript – 如何在switch语句中使用instanceof

前端之家收集整理的这篇文章主要介绍了javascript – 如何在switch语句中使用instanceof前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用自定义错误( es6-error),允许我根据他们的类处理错误
import { DatabaseEntryNotFoundError,NotAllowedError } from 'customError';

function fooRoute(req,res) {
  doSomethingAsync()
    .then(() => {
      // on resolve / success
      return res.send(200);
    })
    .catch((error) => {
      // on reject / failure
      if (error instanceof DatabaseEntryNotFoundError) {
        return res.send(404);
      } else if (error instanceof NotAllowedError) {
        return res.send(400);
      }
      log('Failed to do something async with an unspecified error: ',error);
      return res.send(500);
    };
}

现在我宁愿为这种类型的流程使用一个开关,导致如下:

import { DatabaseEntryNotFoundError,res) {
  doSomethingAsync()
    .then(() => {
      // on resolve / success
      return res.send(200);
    })
    .catch((error) => {
      // on reject / failure
      switch (error instanceof) {
        case NotAllowedError:
          return res.send(400);
        case DatabaseEntryNotFoundError:
          return res.send(404);
        default:
          log('Failed to do something async with an unspecified error: ',error);
          return res.send(500);
      }
    });
}

instanceof不行.所以后者失败了.

有没有办法在switch语句中检查其类的实例?

解决方法

一个很好的选择是使用对象的构造函数 property
// on reject / failure
switch (error.constructor) {
    case NotAllowedError:
        return res.send(400);
    case DatabaseEntryNotFoundError:
        return res.send(404);
    default:
        log('Failed to do something async with an unspecified error: ',error);
        return res.send(500);
}

请注意,构造函数必须与创建对象的构造函数完全匹配(假设错误是NotAllowedError的实例,NotAllowedError是Error的子类):

> error.constructor === NotAllowedError为true
> error.constructor ===错误是false

这与instanceof有所不同,它也可以匹配超级类:

> NotAllowedError的error instanceof为true
> error instanceof Error是true

检查this interesting post关于构造函数属性.

原文链接:https://www.f2er.com/js/155271.html

猜你在找的JavaScript相关文章