首页 > 解决方案 > ES6 代理:捕获未定义的函数执行

问题描述

假设我有以下具有两个函数作为属性的对象:

const foo = {
  f1: () => {...},
  f2: () => {...},
}

当有人尝试执行对象上不存在的函数时,我想执行特定操作(例如,引发自定义错误)foo

我尝试使用get 代理,但即使我尝试执行也会引发错误f3,例如以下代码:

if (foo.f3) {...}

那么,如何以通常foo.f3返回undefinedfoo.f3()会引发错误的方式编写代理?

标签: javascriptecmascript-6

解决方案


这是受Unmiss启发的部分解决方案。

const handler = {
  get: function(obj, prop) {
    if (prop in obj) {
      return obj[prop];
    } else {
      return () => {
        throw new Error(`Foo.${prop} is undefined`);
      }
    }
  }
};

这样做的问题是,虽然它实现了仅在您实际尝试执行时才抛出错误的目标Foo.f3(),因为Foo.f3现在等于该匿名函数不再返回undefined,这意味着(据我所知)if (Foo.f3) {...}将始终返回true

编辑:正如@paulpro 指出的那样:

你绝对不能那样做。foo.f3 要么未定义,要么可以使用自定义逻辑调用;它不能两者兼而有之。

我们能做的最好的事情是f3 in foo使用陷阱进行陷阱语句has,但这意味着if (f3 in foo)并且if (foo.f3)现在会产生不同的结果,这似乎是一个很大的危险信号。


推荐阅读