【问题标题】:Retrieve original target object from existing proxy instance从现有代理实例中检索原始目标对象
【发布时间】:2018-04-23 06:54:32
【问题描述】:

假设我有一个这样的代理实例:

const getProxy = function(){
    return new Proxy({}, ...);
}

const proxy = getProxy();

稍后,我想从代理中检索目标,有什么方法可以做到这一点吗?类似:

const target = proxy.getOriginalTarget()

【问题讨论】:

  • 否,但可能存在非标准方法。见stackoverflow.com/a/38385693/283863
  • 你能添加评论作为答案吗
  • 坦率地说,我认为这个问题与我提到的问题非常相似,尽管那个问题是关于获取处理程序而不是原始目标。我可以将其写为答案,但我认为该页面上的答案已经足够了。
  • 这更多是关于确切的 API 调用(如果有的话),因为我似乎找不到这个特定调用的文档。
  • 你不能。另外,永远不要为任何事情使用代理。

标签: javascript node.js es6-proxy


【解决方案1】:

我还没有听说过标准解决方案,但您可以构建您的工厂函数,该函数返回 new Proxy 具有自定义属性的对象:

function buildProxy(target, handler) {
    const proxy = new Proxy(target, handler);

    proxy.originalTarget = target;

    return proxy;
}

const test = {};
const handler = {};

buildProxy(test, handler).originalTarget === test; // true

【讨论】:

  • 非常感谢 - 这也是保留对 target 的引用的解决方案,以便在 WeakMap 中使用底层对象(在代理处理程序中 target 是原始的,但在任何地方在this 类中引用代理)。这解决了这个问题。
【解决方案2】:

在某些情况下,我用来解决此问题的一个技巧是使用 JSON.stringify 剥离 Proxy 对象,然后使用 JSON.parse 将其作为对象返回:

const test = {name: 'Proxy', test: true};
const handler = {};

const proxy = new Proxy(test, handler); // Proxy {name: "Proxy", test: true}

originalTarget = JSON.parse(JSON.stringify(proxy)); // {name: 'Proxy', test: true}

这个 hack 需要注意的重要一点是,新对象的属性可以等同于原始对象的属性,但整个对象不能,例如:

originalTarget === test // false
originalTarget == test // false

originalTarget.name === test.name // true
originalTarget.test === test.test // true

【讨论】:

  • 这真是个天才,为我节省了很多时间。
【解决方案3】:

只需将其解构为一个新对象:

myNewSimpleObject = {...myProxy}

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多