Создание копии объекта

Важно учитывать, что простое присваивание копирует лишь ссылку на объект, а не создает копию объекта. Поэтому обе переменные будут ссылаться на один и тот же объект:

let obj1 = { a: 10 };
let obj2 = obj1;
obj2.a = 22;
console.log( obj1 );  // { a: 22 }
console.log( obj2 );  // { a: 22 }

Для создания поверхностной копии можно воспользоваться оператором SPREAD:

let obj1 = Object.create(Object.prototype, {
   'a': {
      value: 10,
      writable: true,
      configurable: true,
      enumerable: true
   },
   'b': { value: 3, enumerable: false }
});
let obj2 = { ...obj1 };
obj2.a = 22;
console.log( obj1 );  // { a: 10 }
console.log( obj2 );  // { a: 22 }
// Копируются только собственные перечислимые свойства
console.log( Object.getOwnPropertyNames(obj2) );  // [ 'a' ]

При этом копируются только собственные перечислимые свойства объекта. Свойство b из примера не является перечислимым, поэтому оно не было добавлено при копировании. Важно учитывать, что вложенные объекты не копируются. Копируются лишь ссылки на эти объекты, поэтому мы получим поверхностную копию объекта, а не глубокую копию:

let obj = { a: { b: 10} };
let objCopy = { ...obj };
objCopy.a.b = 22;
console.log( obj );      // { a: { b: 22 } }
console.log( objCopy );  // { a: { b: 22 } }

Для копирования собственных перечислимых свойств можно также воспользоваться статическим методом assign() из класса Object. В первом параметре указываем пустой объект, а во втором параметре передаем ссылку на копируемый объект. Метод возвращает ссылку на объект из первого параметра:

let obj1 = Object.create(Object.prototype, {
   'a': {
      value: 10,
      writable: true,
      configurable: true,
      enumerable: true
   },
   'b': { value: 3, enumerable: false }
});
let obj2 = Object.assign({}, obj1);
obj2.a = 22;
console.log( obj1 );  // { a: 10 }
console.log( obj2 );  // { a: 22 }
// Копируются только собственные перечислимые свойства
console.log( Object.getOwnPropertyNames(obj2) );  // [ 'a' ]

Если нужно скопировать все собственные свойства, то можно воспользоваться следующим кодом:

let obj1 = Object.create(Object.prototype, {
   'a': {
      value: 10,
      writable: true,
      configurable: true,
      enumerable: true
   },
   'b': { value: 3, enumerable: false }
});
let obj2 = Object.create(
                  Object.getPrototypeOf(obj1),
                  Object.getOwnPropertyDescriptors(obj1) );
obj2.a = 22;
console.log( obj1 );  // { a: 10 }
console.log( obj2 );  // { a: 22 }
// Копируются все собственные свойства
console.log( Object.getOwnPropertyNames(obj2) );  // [ 'a', 'b' ]

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов