lodash cloneDeep 从对象中删除代理
lodash cloneDeep remove proxy from object
当我深入克隆代理对象时,它 returns 一个没有代理的普通对象。但是当我深度克隆对象时我想要代理对象。
EX:
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
我不知道这个问题有任何简单(直接)的解决方案。
实现此功能的一种方法是修改 Abc
构造函数以将原始对象本身(不是代理)包含在 属性(假设 orig
)中。
然后你就可以定义你自己的复制方法了。当您在代理对象上调用此方法时,它会获取存储在 orig
属性 中的非代理对象,执行 lodash 的 cloneDeep
和 returns 从此克隆创建的新代理对象对象。
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>
现在 proxyObject
和 normalObject
都是代理,我们也可以看到代理对象确实被复制了,因为 运行 proxyObject.arr.push(3)
之后 normalObject
的arr保持不变。
当我深入克隆代理对象时,它 returns 一个没有代理的普通对象。但是当我深度克隆对象时我想要代理对象。
EX:
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
我不知道这个问题有任何简单(直接)的解决方案。
实现此功能的一种方法是修改 Abc
构造函数以将原始对象本身(不是代理)包含在 属性(假设 orig
)中。
然后你就可以定义你自己的复制方法了。当您在代理对象上调用此方法时,它会获取存储在 orig
属性 中的非代理对象,执行 lodash 的 cloneDeep
和 returns 从此克隆创建的新代理对象对象。
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>
现在 proxyObject
和 normalObject
都是代理,我们也可以看到代理对象确实被复制了,因为 运行 proxyObject.arr.push(3)
之后 normalObject
的arr保持不变。