如何将ES6代理变回普通对象(PO​​JO)?

时间:2018-11-01 13:51:53

标签: javascript ecmascript-6 es6-proxy

我正在使用一个将事物转换为ES6代理对象的库,另一个我认为令人窒息的库是因为我将其中的一个传递给了它(我的代码是愚蠢的,我知道),但我无法了解如何取消代理对象。

但是我只是傻瓜。代理可以做任何事情! (在下面回答我的问题...)

7 个答案:

答案 0 :(得分:6)

使用JAXBElement<PatronSearch> jaxbElement = new JAXBElement<PatronSearch>(new QName("http://www.myservice.com/api/schema", "PatronSearch"), PatronSearch.class, patronSearch); 进行了尝试,但是这删除了无法字符串化的所有内容(例如类,函数,回调等),这对我的用例不利,因为我的对象中有一些回调函数声明我想将它们作为我对象的一部分。但是,我发现使用Lodash cloneDeep函数在将代理对象转换为POJO的同时保持对象结构确实非常好。

JSON.parse(JSON.stringify(proxyObj))

答案 1 :(得分:2)

pp = new Proxy(
   {a:1},
   {
      get: function(target, prop, receiver) { 
             if(prop==='target') return target 
           }
   }
)

但这仅在您可以控制代理的创建时才有效。事实证明,这甚至更容易:

pojo = Object.assign({}, proxyObj) // won't unwrap nested proxies though

答案 2 :(得分:1)

我发现了一个骇客。就我而言,我无法控制代理(mobx可观察值)的创建。因此解决方案是:

JSON.parse(JSON.stringify(your.object))

答案 3 :(得分:1)

谢谢@sigfried,这正是我想要的!

这里有一个更详细的版本,使用Symbol避免与真实道具名称发生冲突。

const original = {foo: 'bar'};

const handler = {
  get(target, prop) {
    if (prop === Symbol.for('ORIGINAL')) return target;

    return Reflect.get(target, prop);
  }
};

const proxied = new Proxy(original, handler);

console.assert(original !== proxied);

const unproxied = proxied[Symbol.for('ORIGINAL')];

console.assert(original === unproxied);

答案 4 :(得分:0)

在未代理的对象构造函数中,添加this.self=this

然后确保您的get处理程序允许返回self属性,并且一切都准备就绪。 proxiedMyObj.self===myObj //returns true

答案 5 :(得分:0)

通常,您将为此使用mobx util toJS()。

import { observable, toJS } from "mobx";

const observed = observable({ foo: 'bar' })

const obj = toJS(observed)

答案 6 :(得分:0)

如何使用Spread Operator

 const plainObject = { ...proxyObject };