Javascript 代理:当 属性 在多级对象上不存在时,防止调用任何其他属性

Javascript Proxy: prevent any further properties to get called when a property does not exist on a multi level object

上下文

在模块化架构上工作时,我尝试尽可能多地建立“弱”依赖关系。为此,我使用了一个“bridgeService”来处理所有模块间的交互。

问题

我会按如下方式使用 bridgeService:

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

但是如果模块 B 不存在,这将抛出错误 cannot read property functionA of undefinedbridgeService.moduleB.functionA is not a function

预期

我的意志是软败。如果 属性 链中的任何属性丢失,这将记录警告,return 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 中实现我想要的?如果没有,最好的选择是什么?

谢谢你的灯

I can't get rid of the is not a function error.

您可以让代理包装一个函数:

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

当然,一旦您的模块需要方法return,这就会失败。

Here is an example on codePen