Не могли бы вы объяснить эту функцию глубокого клонирования в Javascript? - PullRequest
0 голосов
/ 28 февраля 2020

Вот функция, которая возвращает глубокий клон того, что вы ему передали.

Считаете ли вы, что это величайшая функция или нет, не могли бы вы помочь мне понять ее?

Я вижу, что она создает новую переменную, которая реплицирует конструктор источника, а затем выполняет итерации. рекурсивно ... но я не совсем понимаю, как это работает.

 function clonator (source) {
  if (source === null || typeof source !== 'object')
    return source;

  const temp = source.constructor();

  for (let key in source) {
    if (Object.prototype.hasOwnProperty.call(source, key)) {
      source['isClone'] = null;
      temp[key] = clonator(source[key]);
      delete source['isClone'];
    }
  }
  return temp;
}

1 Ответ

0 голосов
/ 28 февраля 2020

На самом деле функция пропустила использование свойства isClone, которое предотвращает клонирование объекта навсегда.

В основном эта функция получает любой тип данных и выполняет проверку не на значение NULL и проверку типа для исключения не данных типы без ключей.

Затем требуется новый конструктор, например, чтобы получить массив в качестве цели.

Наконец, он перебирает все перечисляемые ключи и проверяет собственные ключи, что предотвращает прототипы для копирования.

Назначение isClone предотвращает повторное копирование одной и той же части снова и снова и останавливает рекурсивные вызовы.

Теперь необходимо присвоить значение и удалить остаток от isClone.

function clonator (source) {
    if (source === null || typeof source !== 'object' || source.isClone === null)
        return source;

    const temp = source.constructor();

    for (let key in source) {
        console.log('key', key);
        if (Object.prototype.hasOwnProperty.call(source, key)) {
            source['isClone'] = null;
            temp[key] = clonator(source[key]);
            delete source['isClone'];
        }
    }
    return temp;
}

var a = { foo: 42, bar: [1, 2] };
a.b = a;                          // create circular reference

var b = clonator(a);

console.log(b.b.b.foo); // 42
console.log(b.b.b.bar); // [1, 2]
.as-console-wrapper { max-height: 100% !important; top: 0; }
...