jQuery.extend()

Функция jQuery.extend() объединяет два или более объектов в один. Свойства всех объектов записываются в первый переданный объект и jQuery.extend() возвращает ссылку на него. Чтобы не изменять исходные объекты, можно первым аргументом указать пустой объект {}. Все свойства будут записаны в него.

Если в качестве аргументов передаются значения null или undefined, то они просто игнорируются.

Если при копировании встречается свойство с уже существующим именем, то значение этого свойства перезаписывается на новое. Это нормально для примитивных значений. Однако, если старое и новое свойства тоже являются объектами, тогда может возникнуть необходимость их слияния, а не полная перезапись. Чтобы выполнить глубокое слияние объектов, необходимо первым аргументом передать значение true (значение false не поддерживается).

Если jQuery.extend() запускается с одним аргументом, это означает, что целевым объектом для копирования свойств является сам объект jQuery. Это позволяет разработчикам плагинов для jQuery добавлять собственные функции в библиотеку.

Варианты использования

jQuery.extend(объект) => Object
Добавляет свойства переданного объекта в объект jQuery.
jQuery.extend(объект_1, объект_2[, ...]) => Object
Копирует с заменой свойства второго и последующих объектов (если заданы) в первый.
jQuery.extend(true, объект_1, объект_2[, ...]) => Object
Выполняет глубокое копирование свойств второго и последующих объектов (если заданы) в первый.

Примеры

Следующий пример демонстрирует разницу между простым и глубоким копированием свойств.

<html>
<head>
  <title>Функции библиотеки jQuery</title>
  <script type="text/javascript" src="js/jquery.js"></script>
</head>
<body>
  <button id="button_1">Простое копирование</button>
  <button id="button_2">Глубокое копирование</button>
  <p></p>
</body>
</html>
 
<script>
var obj_1 = {
  type: 1,
  age: {'Ваня': 15, 'Петя': 18}
};
var obj_2 = {
  type: 2,
  age: {'Ваня': 15, 'Вася': 16}
};

/* В объект jQuery добавлена функция write, которая возвращает свойства объекта в виде строки */
$.extend({
  write: function() {
    obj = arguments[0] || {};
    var props = '';
    $.each(obj, function(prop, value) {
      value = (typeof value == 'object') ? $.write(value) : value;
      props += prop + ': ' + value + ', ';
    });
    return '{' + props.slice(0, -2) + '}';
  }
});

/* Для вывода свойств объекта на экран используется добавленная ранее функция $.write() */
/* Первым объектом в $.extend() указывается пустой объект {}, чтобы не изменять исходные объекты obj_1 и obj_2 */
$('#button_1').click(function() {
  $('p')[0].innerHTML = $.write($.extend({}, obj_1, obj_2));
});
$('#button_2').click(function() {
  $('p')[0].innerHTML = $.write($.extend(true, {}, obj_1, obj_2));
});
</script>