lodash cloneDeep移除对象中的代理。

6
当我深度克隆代理对象时,它会返回一个没有代理的普通对象。但是我想要在深度克隆对象时保留代理对象。
例如:
class Abc {
  constructor() {
    this.a = 4;
    return new Proxy(this, {
      get(target, name) {
        return target[name];
      },
    });
  }
}

class Xyz {
  constructor() {
    this.x = new Abc();
    this.y = _.cloneDeep(this.x);
  }
}

var proxyObject = new Xyz().x;
var normalObject = new Xyz().y;
console.log(proxyObject); // Type Proxy
console.log(normalObject); // Type Object

有没有办法克隆深度对象,就像原始对象的行为一样,例如 this.x?

1个回答

3
我不知道任何简单(直接)的解决方案来解决这个问题。
实现这个功能的一种方式是修改你的Abc构造函数,将原始对象本身(而不是代理对象)包含在一个属性中(比如说orig)。
然后你可以定义自己的复制方法。当你在代理对象上调用这个方法时,它会获取存储在orig属性中的非代理对象,执行lodash的cloneDeep并返回从这个克隆对象创建的新代理对象。

class Abc {
  constructor(orig = this) {
    this.orig = orig;
    this.a = 4;
    this.arr = [1, 2];
    return new Proxy(this, {
      get(target, name) {
        return target[name];
      },
    });
  }

  copy() {
    const cloned = _.cloneDeep(this.orig);
    return new Proxy(cloned, {
      get(target, name) {
        return target[name];
      }
    });
  }
}

class Xyz {
  constructor() {
    this.x = new Abc();
    this.y = this.x.copy();
  }
}

var proxyObject = new Xyz().x;
var normalObject = new Xyz().y;

console.log(proxyObject); 
console.log(normalObject);

proxyObject.arr.push(3);

console.log(proxyObject.arr);
console.log(normalObject.arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>

现在,proxyObjectnormalObject都是代理对象,我们还可以看到代理对象确实被复制了,因为运行proxyObject.arr.push(3)后,normalObject的arr保持不变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接