如何使用JavaScript代理从另一个对象检查和访问函数?

xxe27gdn  于 2022-10-30  发布在  Java
关注(0)|答案(3)|浏览(120)

我正在练习JavaScript代理,想从另一个对象访问一个方法,但代理对象为空:

const data = {
  hello: {
    log() {
      return 'hello log'
    },
  },
  hi: {
    log() {
      return 'hi log'
    },
  },
}

const blankObject = {} // I can just pass the data object but I want an empty one

const proxy = new Proxy(blankObject, {
  get(target, key) {
    const v = target[key]

    if (typeof v === 'function') {
      // if data.hello.log() or data.hi.log()
      return function() {
         return data[key]['WHAT_TO_DO']// access data.hello.log or data.hi.log() here?
      }
    }

    return v
  }
})

proxy.hello.log() // hello log;

基本上,我试图检查该方法属性是否存在于另一个对象中,我只想告诉代理从另一个对象中获取值,而不将其传递给构造函数。

eulz3vhy

eulz3vhy1#

我不明白你为什么要使用一个与你所代理的对象不同的对象。代理一个空对象没有什么意义。
其次,如果您要访问代理对象的hello属性,那么要意识到这个hello值--在data对象中找到的--* 不是 * 代理的,因此您不应该在这个Proxy中检查属性是否为函式。此时,log属性尚未存取。它'仅关于代理知道的hello访问。
但是当hello被访问时,你可以通过验证它确实是data对象的一个属性,将路径转向data对象。

const data = {
  hello: {
    log() {
      return 'hello log';
    },
  },
  hi: {
    log() {
      return 'hi log'
    },
  },
}

const blankObject = {};

const proxy = new Proxy(blankObject, {
  get(target, key) {
    if (key in data) return data[key]; // <---
    return target[key]; // default
  }
});

console.log(proxy.hello.log()); // hello log;
wqnecbli

wqnecbli2#

我还在想你到底想做什么。你想把一个方法从一个对象添加到另一个对象?

const blankObject = { hello: data.hello };

虽然这感觉有点笨拙。最好是将整个数据对象传递给构造函数,这样空白对象就可以引用它,并且可以在需要时使用它的方法。

owfi6suc

owfi6suc3#

没关系,使用测试,没有必要过度设计!

let data = {
  hello: {
    log() {
      return 'hello log'
    },
  },
  hi: {
    log() {
      return 'hi log'
    },
  },
}

let blankObject = {} // I can just pass the data object but I want an empty one

// We test if the object has a given property and return accordingly 
console.log(

  (blankObject["hello"]) ? blankObject.hello.log() : data.hello.log()

)

相关问题