Object.assign () - очень полезный метод для копирования значений из одного объекта в другой. Он принимает два параметра: целевой объект и источник для копирования. Оба параметра должны быть объектами. Мы можем копировать более чем с одного объекта. Давайте сразу перейдем к простому примеру:
const objToCopyFrom = { prop1: true, prop2: 'false' }; const objToCopyInto = Object.assign({}, objToCopyFrom); // {prop1: true, prop2: "false"}
В случае копирования из нескольких объектов мы можем разделить значения запятой:
const obj1 = { first: 1 }; const obj2 = { second: 2 }; const obj3 = { third: 3 }; const target = Object.assign({}, obj1, obj2, obj3); // {first: 1, second: 2, third: 3}
Целевой объект не всегда должен быть пустым:
const prefilled = { some: 'value' }; const added = Object.assign(prefilled, { other: 'value' }); // {some: "value", other: "value"}
Если свойство существует, оно будет переопределено:
const altered = Object.assign(prefilled, { some: 'this will be a new val' }); // {some: "this will be a new val"}
Важно отметить, что будут скопированы только перечислимые свойства. Что это? Ну, enumerable - это специальный флаг, установленный для объекта. Если установлено значение true - свойство будет включено там, где мы перебираем объект. Когда мы создаем объект, у него по умолчанию установлены некоторые флаги.
Мы можем прочитать их значения с помощью метода Object.getOwnPropertyDescriptors ()
:
const objDescriptors = { example: true, another: false }; Object.getOwnPropertyDescriptors(objDescriptors);
даст:
Подтверждаем, что копировать можно только перечислимые свойства:
const obj = {}; Object.defineProperty(obj, 'notEnumerable', { enumerable: false }); let newObj = Object.assign({}, obj); // {}, property not copied Object.defineProperty(obj, 'enumerable', { enumerable: true, value: 'copied' }); newObj = Object.assign({}, obj); // {enumerable: "copied"}
Установка флага enumerable в значение false предотвратит копирование этого свойства.
В качестве альтернативы вы можете использовать синтаксис распространения для копирования:
const obj1 = { a: 1, b: 2 }; const obj2 = { c: 3, d: 4 }; const copy = { ...obj1, ...obj2 }; // {a: 1, b: 2, c: 3, d: 4}
В отличие от Object.assign (), сеттеры не запускаются.