Я бачив це в плагіні:
var options = $.extend(defaults, options);
Як це працює?
Що робить extend()
?
Я бачив це в плагіні:
var options = $.extend(defaults, options);
Як це працює?
Що робить extend()
?
Відповіді:
Документація не є точною для пояснення того, як працює розширення, тому я провів невеликий тест:
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
{zed: 'dark'}
а не, 2
і ти встановиш r.baz.zed = 'light'
, яке значення b.baz.zed
буде? тобто властивості копіюються або об'єднуються за посиланням?
b.baz.zed
було б light
- тобто значення об'єднані за посиланням. дивіться скрипку
Він зливає зміст одного об’єкта з іншим . Якщо ми передамо два об'єкти, до першого об'єкта / першого параметра додаються властивості другого об'єкта
Ex: $.extend(object1, object2);
Тепер object1 містить властивості object2
Якщо ми хочемо об'єднати два об’єкти , тоді нам потрібно передати порожній об’єкт у першому параметрі
Ex: var newObject = $.extend({}, object1, object2);
Тепер newObject містить як властивості object1, так і object2 .
З документації jQuery
Об’єднайте вміст двох або більше об'єктів разом у перший об’єкт.
У контексті плагіна: Якщо користувач не встановив додаткові параметри для функції, то замість цього буде використано значення за замовчуванням.
Як працює 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}. Кількість параметрів, що передаються цій функції, необмежена.
Мета - розширити існуючий об’єкт. Наприклад, якщо у нас є об’єкт шаблону і ми хочемо розширити, додавши більше властивостей або переосмисливши існуючі властивості, розширення 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 - це вказати, чи потрібна нам глибока або неглибока копія
Це робить саме це
Опис : Об’єднайте вміст двох або більше об’єктів разом у перший об’єкт.
Більше на jQuery.extend ()