02. Copying Objects

Object.assign

Функция Object.assign получает список объектов и копирует в первый target свойства из остальных. При этом последующие свойства перезаписывают предыдущие. Этот прием так же можно использовать для поверхностного копирования.

Object.assign(target, src1, src2...)
const user = { name: "Вася" };
const visitor = { isAdmin: false, visits: true };
const admin = { isAdmin: true };
Object.assign(user, visitor, admin); // name: Вася, visits: true, isAdmin: true

// clone = пустой объект + все свойства user
const user = { name: "Вася", isAdmin: false };
const clone = Object.assign({}, user);

Особенности:

  • Object.assign копирует как строковые ключи, так и символьные

  • Копируются только собственные перечисляемые свойства. Унаследованные и неперечисляемые свойства игнорируются.

  • Чтение свойства - это обычная операция получения свойства. Если свойство представляет собой метод доступа, то копируется только полученное значение, а не сам метод.

  • Запись свойства в target - это обычная операция присваивания свойства. Функции setter-ы не копируются.

  • Нельзя скопировать метод, использующий super в другой объект.

Для полного копирования всех свойств, включая копирование методов доступа необходимо использовать следующие функции:

Способ 2:

Метод Object.assign можно использовать для заполнения значений по умолчанию:

A method that uses super is firmly connected with its home object (the object it is stored in). There is currently no way to copy or move such a method to a different object.

Deep copy

Для создания полностью идентичной копии другого объекта необходимо выполнить два шага:

  • Копия должна иметь тот же прототип

  • Копия должна иметь те же атрибуты с теми же значениями, что и оригинал.

Шаги алгоритма:

  1. Get an array with the keys of all own properties of source.

  2. Iterate over those keys.

  3. Retrieve a property descriptor.

  4. Use that property descriptor to create an own property in target.

Last updated

Was this helpful?