lodash cloneDeep удалить прокси с объекта - PullRequest
0 голосов
/ 03 июня 2018

Когда я глубоко клонирую прокси-объект, он возвращает обычный объект без прокси.но мне нужен прокси-объект, когда я глубоко клонирую объект.

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

1 Ответ

0 голосов
/ 03 июня 2018

Я не знаю ни одного простого (простого) решения этой проблемы.

Один из способов достижения этой функциональности - изменить конструктор 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 * остается неизменной.

...