6

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

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

const proxy = getProxy();

稍后,我想从代理中检索目标,有什么办法吗?就像是:

const target = proxy.getOriginalTarget()
4

3 回答 3

5

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

myNewSimpleObject = {...myProxy}

干杯!

于 2021-01-19T16:20:26.973 回答
4

我还没有听说过标准解决方案,但您可以构建您的工厂函数,该函数返回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
于 2019-10-11T07:25:36.333 回答
3

在某些情况下,我用来解决此问题的一种技巧是使用 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
于 2020-03-26T20:18:53.797 回答