Несколько параметров
Документация не дает точных объяснений того, как работает расширение, поэтому я провел небольшой тест:
var a = {foo: 1, bar: 1};
var b = {foo: 2, baz: 2};
var c = {foo: 3};
var r = jQuery.extend(a,b,c);
console.log("A: Foo=" + a.foo + " Bar=" + a.bar + " Baz=" + a.baz);
console.log("B: Foo=" + b.foo + " Bar=" + b.bar + " Baz=" + b.baz);
console.log("C: Foo=" + c.foo + " Bar=" + c.bar + " Baz=" + c.baz);
console.log("R: Foo=" + r.foo + " Bar=" + r.bar + " Baz=" + r.baz);
console.log("A === R?: " + (a === r));
(функция console.log
предназначена для работы вFirebug; замените его на alert () или какую-нибудь другую выходную функцию, если хотите).
Результаты:
A: Foo=3 Bar=1 Baz=2
B: Foo=2 Bar=undefined Baz=2
C: Foo=3 Bar=undefined Baz=undefined
R: Foo=3 Bar=1 Baz=2
A === R?: true
Таким образом, мы видим, что jQuery.extend ():
- Начинается с объекта, указанного в первом параметре.
- Добавляет к нему любое свойство во втором параметре.Если свойство уже существует в первом параметре, оно перезаписывается.Объект для второго параметра не изменяется.
- Повторяет вышеуказанное с любым последующим параметром.
- Возвращает первый параметр.
Это полезно для объединения пользователя иопции-объекты по умолчанию вместе, чтобы получить полный набор опций:
function foo(userOptions) {
var defaultOptions = {
foo: 2,
bar: 2
};
var someOtherDefaultOptions = {
baz: 3
};
var allOptions = jQuery.extend(
defaultOptions,
someOtherDefaultOptions,
userOptions
);
doSomething(allOptions);
}
foo({foo:1, baz:1});
Обратите внимание, что «null» является допустимым значением для перезаписи, но «undefined» - нет.Вы могли бы использовать это.
var a = {foo: "a", bar: "a"};
var b = {foo: null, bar: undefined};
jQuery.extend(a,b);
console.log("A: Foo=" + a.foo + " Bar=" + a.bar);
Результаты:
A: Foo=null Bar=a
Одиночный параметр
Если вы передаете только один объект jQuery.extend()
,тогда jQuery предполагает, что jQuery
объект сам является «первым» параметром (т. е. изменяемым), а ваш объект - «вторым» (т. е. добавляемым к первому).).Итак:
console.log( "Before: " + jQuery.foo );
jQuery.extend({foo:1});
console.log( "After: " + jQuery.foo );
Результат:
Before: undefined
After: 1