如何使用JavaScript Proxy检查并访问另一个对象中的函数?
解决方案
要实现通过空对象的Proxy访问data中的方法,且无需将data传入Proxy构造函数,你需要调整Proxy的get陷阱逻辑,直接从data中取值,并处理嵌套对象的递归拦截:
const data = { hello: { log() { return 'hello log' }, }, hi: { log() { return 'hi log' }, }, } const blankObject = {} const proxy = new Proxy(blankObject, { get(target, key) { // 直接从data中获取对应属性 const value = data[key]; // 检查属性是否存在于data中 if (!Object.prototype.hasOwnProperty.call(data, key)) { return undefined; } // 如果是对象(非函数),返回该对象的Proxy以支持嵌套访问 if (typeof value === 'object' && value !== null && typeof value !== 'function') { return new Proxy(value, this); } // 如果是函数,绑定上下文确保this指向正确的子对象 if (typeof value === 'function') { return value.bind(data[key]); } return value; } }) console.log(proxy.hello.log()); // 输出: hello log console.log(proxy.hi.log()); // 输出: hi log console.log(proxy.nonexist?.log()); // 输出: undefined
关键逻辑说明:
- 直接从
data取值:跳过空的target对象,直接操作外部data,满足无需传入目标对象的需求。 - 递归拦截嵌套对象:访问
proxy.hello时返回data.hello的Proxy,后续访问.log会再次触发get陷阱,保证嵌套属性能被正确处理。 - 函数上下文绑定:用
bind(data[key])确保函数调用时this指向data中对应的子对象(如hello或hi),避免this指向错误。 - 严格属性校验:用
hasOwnProperty判断data是否真正包含该属性,排除继承来的属性,提升校验准确性。
内容的提问来源于stack exchange,提问作者Wally Jose
相关产品推荐
相关产品推荐

