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 undefined
或 bridgeService.moduleB.functionA is not a function
。
预期
我的意志是软败。如果 属性 链中的任何属性丢失,这将记录警告,return null
或 false
并阻止调用所有其他属性。
实际代码
这是我目前得到的:
// 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,这就会失败。
上下文
在模块化架构上工作时,我尝试尽可能多地建立“弱”依赖关系。为此,我使用了一个“bridgeService”来处理所有模块间的交互。
问题
我会按如下方式使用 bridgeService:
// in moduleA.js
bridgeService.moduleB.functionA();
但是如果模块 B 不存在,这将抛出错误 cannot read property functionA of undefined
或 bridgeService.moduleB.functionA is not a function
。
预期
我的意志是软败。如果 属性 链中的任何属性丢失,这将记录警告,return null
或 false
并阻止调用所有其他属性。
实际代码
这是我目前得到的:
// 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,这就会失败。