Jak działa extension () w jQuery?

119

Widziałem to we wtyczce:

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

Jak to działa?

Co robi extend()?

Todd Terry
źródło
1
Można o tym przeczytać w dokumentacji jQuery, ale myślę, że to jest lepsze wyjaśnienie dla niego.
ifaour
jQuery ma dobrą dokumentację. api.jquery.com Po prostu wpisz nazwę metody w polu Search jQuery .
user113716,
42
Myślę, że Todd chce wiedzieć, jak działa jQuery.extend, a nie jak z niego korzystać. Na przykład, czy wykonuje pętlę przez każdą właściwość, aby utworzyć zupełnie nowy obiekt, czy też wykorzystuje dziedziczenie prototypów w niesamowity sposób.
b01

Odpowiedzi:

178

Wiele parametrów

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.logFunkcja 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 ():

  • Rozpoczyna się od obiektu dostarczonego przez pierwszy parametr.
  • Dodaje do niej dowolną właściwość w drugim parametrze. Jeśli właściwość już istnieje w pierwszym parametrze, zostanie nadpisana. Obiekt dla drugiego parametru pozostaje niezmieniony.
  • Powtarza powyższe z każdym kolejnym parametrem.
  • Zwraca pierwszy parametr.

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

Pojedynczy parametr

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
Craig Walker
źródło
3
więc jeśli b.baz byłby przedmiotem, powiedz, {zed: 'dark'}a nie 2ustawionym r.baz.zed = 'light', jaka byłaby wartość b.baz.zedbe? tj. czy właściwości są kopiowane lub łączone przez odniesienie?
ErichBSchulz
4
odpowiadając na moje własne pytanie, b.baz.zedbyłoby light- tj. wartości są łączone przez odniesienie. zobacz skrzypce
ErichBSchulz
4
wspaniałe wyjaśnienie, +1
Carrie Kendall
2
Mam nadzieję, że oficjalna dokumentacja powinna być tak jasna jak ta. +1
Thariq Nugrohotomo
2
$ .extend (prawda, obiekt1, obiekt2); i $ .extend (obiekt1, obiekt2); różnica ...
Vinay S Jain
27

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 .

Gopal
źródło
12

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.

JOBG
źródło
1
Ta odpowiedź powinna być w komentarzu.
Nolo
Dziękuję JOBG !!
Harsha Vardhan
7

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.

    wprowadź opis obrazu tutaj

  • 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)

    wprowadź opis obrazu tutaj

  • 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.

    wprowadź opis obrazu tutaj

  • 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.

    wprowadź opis obrazu tutaj

  • 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.

    wprowadź opis obrazu tutaj

christian Nguyen
źródło
1
W dokach „Ostrzeżenie: przekazanie fałszu dla pierwszego argumentu nie jest obsługiwane”.
Nolo
2

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

Sanjay Bharwani
źródło
Co oznacza głęboka lub płytka kopia?
Selva Ganapathi
0

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 ()

Gabriele Petrioli
źródło
1
Odpowiedzi w jednym wierszu i linki do dokumentów nie są zbyt przydatne jako odpowiedź i należy je pozostawić w komentarzu.
Nolo