从现有代理实例中检索原始目标对象

时间:2017-11-10 05:17:04

标签: javascript node.js es6-proxy

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

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

const proxy = getProxy();

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

const target = proxy.getOriginalTarget()

3 个答案:

答案 0 :(得分: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}

此技巧要注意的一件事是,新对象的属性可以等同于原始对象的属性,但是整个对象不能,例如:

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

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

答案 1 :(得分:2)

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

myNewSimpleObject = {...myProxy}

干杯!

答案 2 :(得分:0)

我还没有听说过标准解决方案,但是您可以构建工厂函数,该函数返回具有自定义属性的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