Dom7 — это облегчённая библиотека для работы с DOM в стиле jQuery, используемая, в частности, во фреймворке Framework7. Одним из часто применяемых инструментов в Dom7 является слияние объектов, которое позволяет объединять свойства нескольких объектов в один, что удобно при работе с настройками компонентов, параметрами функций или конфигурациями плагинов.
В Dom7 для этого используется метод
$.extend(), аналогичный одноимённой
функции jQuery. Он позволяет копировать свойства из одного или
нескольких исходных объектов в целевой объект.
var obj1 = {a: 1, b: 2};
var obj2 = {b: 3, c: 4};
var result = $.extend(obj1, obj2);
console.log(result); // {a: 1, b: 3, c: 4}
В данном примере свойства obj2 переписывают свойства
obj1 при совпадении ключей. Метод возвращает
целевой объект, что позволяет использовать цепочку
операций.
По умолчанию $.extend() выполняет поверхностное
копирование, то есть вложенные объекты заменяются целиком. Для
глубокого слияния используется первый аргумент true:
var obj1 = {a: 1, b: {x: 1, y: 2}};
var obj2 = {b: {y: 3, z: 4}, c: 5};
var result = $.extend(true, {}, obj1, obj2);
console.log(result); // {a: 1, b: {x: 1, y: 3, z: 4}, c: 5}
Ключевой момент: глубокое слияние рекурсивно объединяет вложенные объекты, но не копирует функции и прототипы объектов.
Чтобы не изменять исходные объекты, часто используют пустой объект в качестве целевого:
var defaults = {a: 1, b: 2};
var options = {b: 3, c: 4};
var settings = $.extend({}, defaults, options);
console.log(settings); // {a: 1, b: 3, c: 4}
console.log(defaults); // {a: 1, b: 2}
Такой приём позволяет сохранить исходные конфигурации без изменений, что особенно важно при работе с библиотечными настройками.
$.extend() поддерживает объединение нескольких объектов
одновременно:
var obj1 = {a: 1};
var obj2 = {b: 2};
var obj3 = {c: 3};
var merged = $.extend({}, obj1, obj2, obj3);
console.log(merged); // {a: 1, b: 2, c: 3}
Порядок аргументов имеет значение: последующие объекты перезаписывают свойства предыдущих при совпадении ключей.
При слиянии функций или массивов Dom7 ведёт себя следующим образом:
var obj1 = {arr: [1,2], fn: () => 'a'};
var obj2 = {arr: [3,4], fn: () => 'b'};
var result = $.extend(true, {}, obj1, obj2);
console.log(result.arr); // [3,4]
console.log(result.fn()); // 'b'
Чтобы объединить массивы или комбинировать функции, требуется писать кастомную логику.
Слияние объектов активно используется для:
Пример настройки слайдера:
var defaultParams = {speed: 300, loop: false};
var userParams = {loop: true};
var sliderParams = $.extend({}, defaultParams, userParams);
// sliderParams = {speed: 300, loop: true}
Такой подход обеспечивает гибкость и безопасное расширение настроек, минимизируя ошибки при обновлении конфигураций.
В современных проектах на Dom7 нередко используют spread-оператор для слияния объектов:
var obj1 = {a: 1, b: 2};
var obj2 = {b: 3, c: 4};
var merged = {...obj1, ...obj2};
console.log(merged); // {a: 1, b: 3, c: 4}
Spread-оператор обеспечивает простое поверхностное слияние, но для
глубокого слияния по-прежнему требуется $.extend(true, ...)
или кастомная функция.
{} как цели помогает
избежать побочных эффектов на исходные данные.$.extend() для гибкой настройки компонентов
без изменения глобальных стандартных параметров.