Як працює extension () у jQuery?


119

Я бачив це в плагіні:

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

Як це працює?

Що робить extend()?


1
Ви можете прочитати про це в документації на jQuery, але, мабуть, це краще пояснення.
ifaour

jQuery має хороші документи. api.jquery.com Просто введіть ім'я методу в поле Search jQuery .
користувач113716

42
Я думаю, що Тодд хоче знати, як працює jQuery.extend, а не як ним користуватися. Наприклад, чи проходить цикл через кожну властивість, щоб створити абсолютно новий об'єкт, чи використовує наслідування прототипу якимсь дивним способом.
b01

Відповіді:


178

Кілька параметрів

Документація не є точною для пояснення того, як працює розширення, тому я провів невеликий тест:

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; замініть її на сигнал попередження () або якусь іншу функцію виводу, якщо вам це подобається).

Результати:

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 (true, object1, object2); і $ .extend (object1, object2); різниця ...
Vinay S Jain

27

Він зливає зміст одного об’єкта з іншим . Якщо ми передамо два об'єкти, до першого об'єкта / першого параметра додаються властивості другого об'єкта

Ex: $.extend(object1, object2);

Тепер object1 містить властивості object2

Якщо ми хочемо об'єднати два об’єкти , тоді нам потрібно передати порожній об’єкт у першому параметрі

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

Тепер newObject містить як властивості object1, так і object2 .


12

З документації jQuery

Об’єднайте вміст двох або більше об'єктів разом у перший об’єкт.

У контексті плагіна: Якщо користувач не встановив додаткові параметри для функції, то замість цього буде використано значення за замовчуванням.


1
Ця відповідь має бути в коментарі.
Ноло

Дякую ДЖОБГ !!
Харша Вардан

7

Як працює extension () у jQuery? [Розв’язано]

jQuery мають глибоку копію та легку копію. Перші булеві вирішують це, вірно для глибокого і хибного для світла.

Наприклад:

  • jQuery.extend (false, {'a': {'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
З доків "Попередження: передача помилки для першого аргументу не підтримується."
Ноло

2

Мета - розширити існуючий об’єкт. Наприклад, якщо у нас є об’єкт шаблону і ми хочемо розширити, додавши більше властивостей або переосмисливши існуючі властивості, розширення jquery може бути корисним.

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
Відповіді в одному рядку та посилання на документи не дуже корисні як відповідь, і їх слід залишити в коментарі.
Ноло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.