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

前端之家收集整理的这篇文章主要介绍了javascript – 如何在switch语句中使用instanceof前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用自定义错误( es6-error),允许我根据他们的类处理错误
  1. import { DatabaseEntryNotFoundError,NotAllowedError } from 'customError';
  2.  
  3. function fooRoute(req,res) {
  4. doSomethingAsync()
  5. .then(() => {
  6. // on resolve / success
  7. return res.send(200);
  8. })
  9. .catch((error) => {
  10. // on reject / failure
  11. if (error instanceof DatabaseEntryNotFoundError) {
  12. return res.send(404);
  13. } else if (error instanceof NotAllowedError) {
  14. return res.send(400);
  15. }
  16. log('@R_301_159@ to do something async with an unspecified error: ',error);
  17. return res.send(500);
  18. };
  19. }

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

  1. import { DatabaseEntryNotFoundError,res) {
  2. doSomethingAsync()
  3. .then(() => {
  4. // on resolve / success
  5. return res.send(200);
  6. })
  7. .catch((error) => {
  8. // on reject / failure
  9. switch (error instanceof) {
  10. case NotAllowedError:
  11. return res.send(400);
  12. case DatabaseEntryNotFoundError:
  13. return res.send(404);
  14. default:
  15. log('@R_301_159@ to do something async with an unspecified error: ',error);
  16. return res.send(500);
  17. }
  18. });
  19. }

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

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

解决方法

一个很好的选择是使用对象的构造函数 @L_301_2@:
  1. // on reject / failure
  2. switch (error.constructor) {
  3. case NotAllowedError:
  4. return res.send(400);
  5. case DatabaseEntryNotFoundError:
  6. return res.send(404);
  7. default:
  8. log('@R_301_159@ to do something async with an unspecified error: ',error);
  9. return res.send(500);
  10. }

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

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

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

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

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

猜你在找的JavaScript相关文章