На самом деле функция пропустила использование свойства 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; }