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

Javascript代理:防止在多级对象上不存在属性时调用任何其他属性 上下文,javascript,node.js,modularity,Javascript,Node.js,Modularity,在处理模块化体系结构时,我尝试尽可能多地建立“弱”依赖关系。为此,我使用一个“bridgeService”来处理所有模块间的交互 问题 我将按如下方式使用bridgeService: //在moduleA.js中 bridgeService.moduleB.functo(); 但是如果moduleB不存在,这将抛出一个错误无法读取未定义的属性function或bridgeService.moduleB.function不是函数 期望 我的意愿是它轻轻地失败。如果属性链中的任何属性丢失,这将记录

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

问题 我将按如下方式使用bridgeService:

//在moduleA.js中
bridgeService.moduleB.functo();
但是如果moduleB不存在,这将抛出一个错误
无法读取未定义的属性function
bridgeService.moduleB.function不是函数

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

实际代码 以下是我目前得到的信息:

//代理处理程序
常量SafeNotInstancedWarningProxy={
获取:函数(对象、道具){
if(对象中的prop)返回对象[prop];
否则{
warn(`${prop}未定义`);
返回新代理({},SafeNotInstancedWarningProxy);
}
}
}
const bridgeService=新代理({},SafeNotInstancedWarningProxy)
这将永远不会抛出第一个未定义的
无法读取属性function的错误。但是当调用最后一个函数时,我无法摆脱
不是函数的错误

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

谢谢你的灯

我无法摆脱的不是函数错误

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

返回新代理(()=>{
console.warn(“…不是函数”);
},SafeNotInstancedWarningProxy);
当然,一旦您的模块期望方法返回某些内容,这将失败


可能不完全是您想要的,但是如果您使用Node>=v14,您可以尝试一下。这是一个不错的主意,这将导致
bridgeService.moduleB?.function?()是,但在
函数
()
之间使用
,而不是仅使用
。否则它可能会被视为ternary您的
safenotInstancedWarningProxy
是一个返回处理程序对象的函数,但您永远不会调用该函数!只要放下
()=>
,这主意不错。但是,我并不总是知道它何时会成为属性堆栈中的函数。它可以是
a.b.c()
a.b.c.d.e()
。理想的情况是,这两种情况下都能起作用,没关系。它们都是函数
a.b.c
是一个函数,代理给它一个
.d
属性。
b、
d`和
e
(甚至可能是
a
本身)也是如此。事实上,它工作得非常好!我一眼就不太明白。为了更加明确,我添加了一个示例代码。