Метод $.extend()

Метод $.extend() в Bliss.js используется для копирования свойств одного или нескольких объектов в целевой объект. Он является одним из ключевых инструментов для работы с конфигурациями, настройками и объединением данных, обеспечивая гибкость и удобство при работе с объектами JavaScript.

Синтаксис

$.extend(target, object1, [objectN])
$.extend(true, target, object1, [objectN])
  • target — объект, в который будут скопированы свойства.
  • object1, objectN — объекты, свойства которых будут скопированы в target.
  • true — опциональный первый аргумент, указывающий на глубокое копирование (deep copy).

Если true указан, копирование производится рекурсивно для вложенных объектов и массивов, иначе выполняется поверхностное копирование (shallow copy).

Поверхностное копирование

При поверхностном копировании свойства объектов копируются по ссылке. Изменения вложенных объектов в исходном объекте будут отражаться в целевом объекте.

let target = {a: 1, b: {x: 10}};
let source = {b: {y: 20}, c: 3};

$.extend(target, source);

console.log(target); 
// {a: 1, b: {y: 20}, c: 3}

Здесь свойство b целиком заменяется новым объектом {y: 20}, а не объединяется с существующим.

Глубокое копирование

Глубокое копирование используется для сохранения структуры вложенных объектов при объединении.

let target = {a: 1, b: {x: 10}};
let source = {b: {y: 20}, c: 3};

$.extend(true, target, source);

console.log(target);
// {a: 1, b: {x: 10, y: 20}, c: 3}

В этом примере объект b целиком не заменяется, а свойства x и y объединяются.

Несколько объектов

Метод позволяет объединять сразу несколько объектов:

let target = {a: 1};
let source1 = {b: 2};
let source2 = {c: 3, d: 4};

$.extend(target, source1, source2);

console.log(target);
// {a: 1, b: 2, c: 3, d: 4}

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

Практическое использование

1. Объединение настроек с дефолтными значениями

let defaults = {
  theme: "light",
  animation: true,
  speed: 300
};

let options = {
  animation: false,
  speed: 500
};

let settings = $.extend({}, defaults, options);

console.log(settings);
// {theme: "light", animation: false, speed: 500}

Такой подход позволяет безопасно расширять настройки без изменения исходных объектов.

2. Создание новых объектов без изменения исходных

При передаче пустого объекта {} в качестве target, оригинальные объекты остаются неизменными:

let merged = $.extend({}, obj1, obj2);

3. Глубокое объединение вложенных структур

let obj1 = {user: {name: "Alice", age: 25}};
let obj2 = {user: {age: 26, location: "NY"}};

$.extend(true, obj1, obj2);

console.log(obj1);
// {user: {name: "Alice", age: 26, location: "NY"}}

Глубокое объединение критично при работе с конфигурациями, где объекты могут содержать вложенные поля.

Особенности и нюансы

  • Если target не является объектом, метод создаёт объект, копируя свойства исходных объектов.
  • При поверхностном копировании вложенные объекты и массивы копируются по ссылке, что может привести к непредвиденным мутациям.
  • Метод работает только с объектами и массивами, примитивные значения (числа, строки, булевы) перезаписываются как есть.
  • Свойства с undefined в исходных объектах также перезаписывают целевые свойства.

Использование с массивами

$.extend() не объединяет массивы по элементам, а заменяет их целиком:

let target = {arr: [1,2]};
let source = {arr: [3,4]};

$.extend(true, target, source);

console.log(target.arr);
// [3, 4]

Для слияния массивов потребуется отдельная логика, так как метод работает только на уровне объектов.

Итоговое назначение

Метод $.extend() предназначен для безопасного и гибкого объединения объектов, позволяя создавать новые конфигурации, расширять настройки и управлять вложенными структурами данных с возможностью глубокого копирования. Он обеспечивает:

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