Я не знаю ни одного простого (простого) решения этой проблемы.
Один из способов достижения этой функциональности - изменить конструктор Abc
, чтобы он включал сам исходный объект (а не прокси)в свойстве (скажем, orig
).
Тогда вы можете определить свой собственный метод копирования.Когда вы вызываете этот метод для прокси-объекта, он выбирает непрокси-объект, сохраненный в свойстве orig
, выполняет cloneDeep
lodash и возвращает новый прокси-объект, созданный из этого клонированного объекта.
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)
the *Прибыль 1020 * остается неизменной.