Метод $.extend() в Bliss.js используется для
копирования свойств одного или нескольких объектов в целевой
объект. Он является одним из ключевых инструментов для работы с
конфигурациями, настройками и объединением данных, обеспечивая гибкость
и удобство при работе с объектами JavaScript.
$.extend(target, object1, [objectN])
$.extend(true, target, object1, [objectN])
target.Если 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() предназначен для безопасного и
гибкого объединения объектов, позволяя создавать новые
конфигурации, расширять настройки и управлять вложенными структурами
данных с возможностью глубокого копирования. Он обеспечивает: