Как extend () работает в jQuery?

119

Я видел это в плагине:

var options = $.extend(defaults, options); 

Как это работает?

Что extend()делать?

Тодд Терри
источник
1
Вы можете прочитать об этом в документации jQuery, но я думаю, это лучшее объяснение.
ifaour
В jQuery есть хорошие документы. api.jquery.com Просто введите имя метода в поле Search jQuery .
user113716
42
Я думаю, Тодд хочет знать, как работает jQuery.extend, а НЕ как его использовать. Например, перебирает ли он каждое свойство для создания целого нового объекта или каким-то удивительным образом использует наследование прототипов.
b01

Ответы:

178

Несколько параметров

В документации нет точного объяснения того, как работает extension, поэтому я провел небольшой тест:

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
Крейг Уокер
источник
3
Итак, если бы b.baz был объектом, {zed: 'dark'}а не, 2а вы его установили r.baz.zed = 'light', каково было бы значение b.baz.zed? т.е. свойства копируются или объединяются по ссылке?
ErichBSchulz
4
чтобы ответить на мой собственный вопрос, b.baz.zedбыло бы light- т.е. значения объединяются по ссылке. увидеть скрипку
ErichBSchulz
4
великолепное объяснение, +1
Кэрри Кендалл
2
Я надеюсь, что официальная документация должна быть такой же ясной. +1
Thariq Nugrohotomo
2
$ .extend (истина, объект1, объект2); и $ .extend (объект1, объект2); разница ...
Vinay S Jain
27

Он объединяет содержимое одного объекта с другим . Если мы передаем два объекта, свойства второго объекта добавляются к первому объекту / первому параметру

Ex: $.extend(object1, object2);

Теперь объект1 содержит свойства объекта2

Если мы хотим объединить два объекта , нам нужно передать пустой объект в первом параметре.

Ex: var newObject = $.extend({}, object1, object2);

Теперь newObject содержит свойства object1 и object2 .

Гопал
источник
12

Из документации jQuery

Объедините содержимое двух или более объектов в первый объект.

В контексте плагина: если пользователь не устанавливает необязательные параметры для функции, вместо этого будет использоваться значение по умолчанию.

JOBG
источник
1
Этот ответ должен быть в комментарии.
Nolo
Спасибо, РАБОТА !!
Харша
7

Как extend () работает в jQuery? [Решено]

jQuery имеет глубокую копию и легкую копию. Первое логическое значение решает это, истинное для глубокого и ложное для света.

Например:

  • jQuery.extend (ложь, {'а': {'a1': 1}}, {'a': {'a2': 2}})

    результат будет: {'a': {'a2': 2}}, потому что это облегченная копия, просто сравните уровень 1.

    введите описание изображения здесь

  • jQuery.extend (правда, {'a': {'a1': 1}}, {'a': {'a2': 2}})

    результат будет: {'a': {'a1': 1, 'a2': 2}} Это глубокая копия со многими уровнями объекта (как и уровень массива)

    введите описание изображения здесь

  • jQuery.extend (a, b, c) с a, b, c - это объект или массив. Перезапись потока будет b-> a, c -> a (b перезаписать a, c переопределить a ...), эта функция вернет a, а также изменит значение.

Расширенные примеры:

  • jQuery.extend ({'number_param': 1})

    Если вы просто передадите один параметр. jQuery расширится. console.log (jQuery ['number_param']) выведет 1.

    введите описание изображения здесь

  • jQuery.extend (1, {'number_param': '2'}); Этот пример не является добавлением самого jQuery. Первый параметр должен быть логическим. В этом случае он вернет {'number_param': '2'}, и jQuery не будет обновлен.

    введите описание изображения здесь

  • jQuery.extend (a, b, c, d, e, f); Порядок слияния будет. b -> a, c -> a, d -> a, e -> a, f -> a (b отменяет a, c отменяет a ...). И результат возврата будет.

    с a = {'p': 1}. jQuery.extend (a, {'p': 2}, {'p': 3}, {'p': 4}, {'p': 5}) вернет a, а a = {'p': 6}. Число параметров, передаваемых этой функции, не ограничено.

    введите описание изображения здесь

Кристиан Нгуен
источник
1
Из доки «Предупреждение: передача false для первого аргумента не поддерживается».
Nolo
2

Цель - расширить существующий объект. Например, если у нас есть объект-шаблон, и мы хотим расширить его, добавив дополнительные свойства или переопределив существующие свойства, может быть полезно jquery extension.

var carObjectTemplate = {
"make": "honda",
"model":"city",
"mileage":"20",
"variant":"petrol"

};

теперь, если мы хотим расширить его, $.extend(true, {"color":"red"}, carObjectTemplate, {"model": 'amaze'}); он даст нам вывод, расширив carObjectTemplate и добавив

{"color":"red"} property and overriding "model" property from "city" to "amaze"

первый логический параметр true / false указывает, нужна ли нам глубокая или мелкая копия

Санджай Бхарвани
источник
Что означает глубокая или неглубокая копия?
Сельва Ганапати
0

Он делает именно это

Описание : объединить содержимое двух или более объектов в первый объект.

Подробнее на jQuery.extend ()

Габриэле Петриоли
источник
1
Однострочные ответы и ссылки на документы не очень полезны в качестве ответа и должны быть оставлены в комментарии.
Nolo