You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:01:28