Слияние объектов

В библиотеке Zepto работа с объектами и их свойствами реализована через утилитарные методы, аналогичные jQuery, но с оптимизированной и облегчённой структурой. Один из ключевых инструментов — функция $.extend, которая позволяет объединять объекты, копировать свойства и создавать новые конфигурации без изменения исходных данных.


Основной синтаксис $.extend

$.extend(target, object1, object2, ...);
  • target — объект, в который будут скопированы свойства из последующих объектов.
  • object1, object2, ... — объекты, свойства которых будут добавлены или перезаписаны в target.

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

var defaults = {color: "blue", size: "medium"};
var options = {size: "large"};

var settings = $.extend({}, defaults, options);
// settings: {color: "blue", size: "large"}

Здесь options перезаписывает значение свойства size из объекта defaults, при этом исходные объекты остаются неизменными.


Глубокое слияние объектов

По умолчанию $.extend выполняет поверхностное копирование. Для вложенных объектов это значит, что внутренние свойства могут быть потеряны при перезаписи. Для решения этой задачи Zepto поддерживает глубокое слияние, если первый аргумент — true:

var obj1 = {user: {name: "Alice", age: 25}};
var obj2 = {user: {age: 30, city: "Moscow"}};

var merged = $.extend(true, {}, obj1, obj2);
// merged: {user: {name: "Alice", age: 30, city: "Moscow"}}
  • true указывает на рекурсивное копирование.
  • Вложенные объекты объединяются, а не перезаписываются полностью.
  • Полезно при работе с конфигурационными объектами и настройками плагинов.

Ключевые особенности $.extend

  1. Перезапись свойств При совпадении ключей значение из последнего объекта имеет приоритет.

  2. Работа с любыми типами данных Поддерживаются строки, числа, массивы, объекты. Функции копируются как ссылки.

  3. Избежание мутации исходных объектов Создание нового объекта через пустой target позволяет безопасно объединять данные.

  4. Глубокое копирование Для вложенных структур и массивов используется рекурсивный алгоритм, который предотвращает потерю данных.


Примеры использования

Слияние простых настроек:

var defaults = {volume: 50, muted: false};
var userSettings = {muted: true};

var finalSettings = $.extend({}, defaults, userSettings);
// {volume: 50, muted: true}

Объединение массивов и вложенных объектов:

var objA = {list: [1, 2], info: {lang: "en"}};
var objB = {list: [3, 4], info: {version: "1.0"}};

var combined = $.extend(true, {}, objA, objB);
// {list: [3, 4], info: {lang: "en", version: "1.0"}}

Обратите внимание, что массивы не объединяются автоматически; массивы полностью перезаписываются последним объектом.

Использование для расширения плагинов:

(function($){
    $.fn.tooltip = function(options) {
        var defaults = {color: "black", fontSize: "12px"};
        var settings = $.extend({}, defaults, options);

        return this.each(function() {
            $(this).css({
                color: settings.color,
                fontSize: settings.fontSize
            });
        });
    };
})(Zepto);

$('p').tooltip({color: "red"});

В этом примере $.extend объединяет настройки по умолчанию с пользовательскими параметрами, обеспечивая гибкость плагина.


Советы по применению

  • Использовать пустой объект {} в качестве target, если важно сохранить исходные объекты неизменными.
  • Применять глубокое копирование (true), только когда есть вложенные объекты. Для плоских структур это лишняя операция.
  • Следить за массивами: их слияние не происходит автоматически, что может потребовать дополнительной логики.
  • Функции и методы копируются по ссылке, а не создаются заново.

Отличия от jQuery

Zepto реализует $.extend почти идентично jQuery, но не поддерживает слияние некоторых редких типов объектов, например, объектов с нестандартными прототипами. Основное преимущество — легковесность и высокая производительность на мобильных устройствах при работе с небольшими и средними объектами.


С помощью $.extend в Zepto можно легко управлять объектами, конфигурациями и плагинами, обеспечивая чистую структуру данных, повторное использование и безопасное расширение функционала без изменения исходных объектов.