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>