Widziałem to we wtyczce:
var options = $.extend(defaults, options);
Jak to działa?
Co robi extend()
?
Widziałem to we wtyczce:
var options = $.extend(defaults, options);
Jak to działa?
Co robi extend()
?
Odpowiedzi:
Dokumentacja nie wyjaśnia dokładnie, jak działa rozszerzenie, więc przeprowadziłem mały test:
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
Funkcja jest przeznaczona do pracy w Firebug; zamień ją na alert () lub inną funkcję wyjściową, jeśli chcesz).
Wyniki są następujące:
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
W ten sposób widzimy, że jQuery.extend ():
Jest to przydatne do łączenia razem obiektów opcji użytkownika i domyślnych w celu uzyskania pełnego zestawu opcji:
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});
Zauważ, że „null” jest prawidłową wartością do nadpisania, ale „undefined” już nie. Możesz to wykorzystać.
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);
Prowadzi do:
A: Foo=null Bar=a
Jeśli przekazujesz tylko jeden obiekt do jQuery.extend()
, to jQuery zakłada, że samjQuery
obiekt jest „pierwszym” parametrem (tj .: tym, który ma zostać zmodyfikowany), a twój obiekt jest „drugim” (tj .: tym, który ma zostać dodany do pierwszego) . Więc:
console.log( "Before: " + jQuery.foo );
jQuery.extend({foo:1});
console.log( "After: " + jQuery.foo );
Prowadzi do:
Before: undefined
After: 1
{zed: 'dark'}
a nie 2
ustawionym r.baz.zed = 'light'
, jaka byłaby wartość b.baz.zed
be? tj. czy właściwości są kopiowane lub łączone przez odniesienie?
b.baz.zed
byłoby light
- tj. wartości są łączone przez odniesienie. zobacz skrzypce
To łączy zawartość jednego obiektu do drugiego . Jeśli przekazujemy dwa obiekty, właściwości drugiego obiektu są dodawane do pierwszego obiektu / pierwszego parametru
Ex: $.extend(object1, object2);
Teraz object1 zawiera właściwości object2
Jeśli chcemy scalić dwa obiekty , musimy przekazać pusty obiekt w pierwszym parametrze
Ex: var newObject = $.extend({}, object1, object2);
Teraz newObject zawiera obie właściwości object1 i object2 .
Z dokumentacji jQuery
Połącz ze sobą zawartość dwóch lub więcej obiektów w pierwszy obiekt.
W kontekście wtyczki: jeśli użytkownik nie ustawi opcjonalnych parametrów funkcji, zamiast tego zostanie użyta wartość domyślna.
Jak działa extension () w jQuery? [Zdecydowany]
jQuery ma głęboką kopię i uproszczoną kopię. Decyduje o tym pierwsza wartość logiczna, prawdziwa dla głębokiego i fałszywa dla światła.
Na przykład:
jQuery.extend (fałsz, {'a': {'a1': 1}}, {'a': {'a2': 2}})
wynikiem będzie: {'a': {'a2': 2}}, ponieważ jest to uproszczona kopia, wystarczy porównać poziom 1.
jQuery.extend (prawda, {'a': {'a1': 1}}, {'a': {'a2': 2}})
wynikiem będzie: {'a': {'a1': 1, 'a2': 2}} To jest głęboka kopia z wieloma poziomami obiektu (podobnie jak poziom tablicy)
jQuery.extend (a, b, c) z a, b, c to obiekt lub tablica. Zastąpienie przepływu będzie b-> a, c -> a (b zastąpi a, c zastąpi a ...) ta funkcja zwróci a i również zmieni wartość.
Przykłady zaawansowane:
jQuery.extend ({'number_param': 1})
Na wypadek, gdybyś przekazał tylko jeden parametr. jQuery rozszerzy się. console.log (jQuery ['number_param']) zwróci 1.
jQuery.extend (1, {'number_param': '2'}); Ten przykład nie dołącza samego jQuery. Pierwszy parametr musi być logiczny. W tym przypadku zwróci {'number_param': '2'}, a jQuery nie zostanie zaktualizowane.
jQuery.extend (a, b, c, d, e, f); Zlecenie zostanie scalone. b -> a, c -> a, d -> a, e -> a, f -> a (b nadpisuje a, c zastępuje a ...). A wynik będzie miał postać.
z a = {'p': 1}. jQuery.extend (a, {'p': 2}, {'p': 3}, {'p': 4}, {'p': 5}) zwróci a i a = {'p': 6}. Liczba parametrów przekazywanych do tej funkcji jest nieograniczona.
Celem jest rozszerzenie istniejącego obiektu. Na przykład, jeśli mamy obiekt szablonu i chcemy go rozszerzyć, dodając więcej właściwości lub nadpisując istniejące właściwości, przydatne może być rozszerzenie jquery.
var carObjectTemplate = {
"make": "honda",
"model":"city",
"mileage":"20",
"variant":"petrol"
};
teraz jeśli chcemy go rozszerzyć,
$.extend(true, {"color":"red"}, carObjectTemplate, {"model": 'amaze'});
da nam wynik, rozszerzając carObjectTemplate i dodając
{"color":"red"} property and overriding "model" property from "city" to "amaze"
pierwszy parametr logiczny prawda / fałsz służy do wskazania, czy potrzebujemy głębokiej, czy płytkiej kopii
Robi dokładnie to
Opis : Połącz ze sobą zawartość dwóch lub więcej obiektów w pierwszy obiekt.
Więcej na jQuery.extend ()