javascript - ES6 代理:捕获未定义的函数执行
问题描述
假设我有以下具有两个函数作为属性的对象:
const foo = {
f1: () => {...},
f2: () => {...},
}
当有人尝试执行对象上不存在的函数时,我想执行特定操作(例如,引发自定义错误)foo
。
我尝试使用get
代理,但即使我不尝试执行也会引发错误f3
,例如以下代码:
if (foo.f3) {...}
那么,如何以通常foo.f3
返回undefined
但foo.f3()
会引发错误的方式编写代理?
解决方案
这是受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)
现在会产生不同的结果,这似乎是一个很大的危险信号。
推荐阅读
- database-design - 多对多关系的 DynamoDB 架构
- data-structures - 如何将文本文件读入 Erlang 中的地图?
- reactjs - 有没有办法只将 webpack 源文件显示到 chrome 而不是清晰的 React js 代码?
- python - 服务人员让我的网络变慢了!,如何使用workbox为Django工作添加离线功能
- android - 在初始化数据库之前将 SharedPreferences 与 SQLiteOpenHelper 一起使用
- c# - C# Task.Run 不等待动作变量
- css - 根据元素的可变高度设置 translateZ 值
- .net-core - .NET Core SqlException:an error occurred during the pre-login handshake
- java - 用两个循环和两个输出语句重写代码
- python - 如何保存然后从数据框中的文件名中提取一些信息