Javascript代理:当多层对象上不存在属性时,防止调用任何进一步的属性



上下文

当我在模块化架构上工作时;弱";依赖关系。为此,我使用";桥接服务";处理所有模块间交互。

问题

我会使用如下桥接服务:

// in moduleA.js
bridgeService.moduleB.functionA();

但如果模块B不存在,则会引发错误cannot read property functionA of undefinedbridgeService.moduleB.functionA is not a function

期望

我的意愿是它轻轻地失败。如果属性链中的任何属性丢失,这将记录一条警告,返回nullfalse并阻止调用所有其他属性

实际代码

这是我现在得到的:

// Proxy handler
const safeNotInstanciatedWarningProxy = {
get: function (object, prop) {
if (prop in object) return object[prop];
else {
console.warn(`${prop} not defined`);
return new Proxy({}, safeNotInstanciatedWarningProxy);
}
}
}
const bridgeService = new Proxy({}, safeNotInstanciatedWarningProxy)

这将永远不会引发第一个cannot read property functionA of undefined错误。但是当调用最后一个函数时,我无法消除is not a function错误。

有没有一种方法可以在javascript中实现我想要的东西?如果没有,最好的选择是什么?

感谢您的灯光

我无法摆脱这不是一个函数错误。

您可以将代理包装改为一个函数:

return new Proxy(() => {
console.warn("… and is not a function");
}, safeNotInstanciatedWarningProxy);

当然,一旦您的模块期望方法返回一些东西,这将失败。

下面是一个关于codePen 的例子

最新更新