Extend () jQuery'de nasıl çalışır?


119

Bunu bir eklentide gördüm:

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

O nasıl çalışır?

Ne anlama geliyor extend()?


1
Bunu jQuery belgelerinde okuyabilirsiniz ama sanırım bu onun için daha iyi bir açıklama.
ifaour

jQuery'nin iyi belgeleri vardır. api.jquery.com JQuery ara alanına yöntem adını yazmanız yeterlidir .
user113716

42
Sanırım Todd, jQuery.extend'in nasıl kullanılacağını DEĞİL, nasıl çalıştığını bilmek istiyor. Örneğin, tamamen yeni bir nesne oluşturmak için her özellikte döngü mü yoksa prototip kalıtımını harika bir şekilde mi kullanıyor?
b01

Yanıtlar:


178

Çoklu Parametreler

Belgeler, uzantının nasıl çalıştığını açıklamada kesin değil, bu yüzden küçük bir test yaptım:

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İşlevin Firebug'da çalışması amaçlanmıştır; isterseniz alert () veya başka bir çıktı işleviyle değiştirin).

Sonuçlar:

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

Bununla jQuery.extend () 'i görebiliriz:

  • İlk parametrenin sağladığı nesneyle başlar.
  • İkinci parametrede herhangi bir özelliği ekler. Özellik ilk parametrede zaten mevcutsa, üzerine yazılır. İkinci parametrenin nesnesi değişmez.
  • Yukarıdakileri sonraki herhangi bir parametre ile tekrar eder.
  • İlk parametreyi döndürür.

Bu, eksiksiz bir seçenek kümesi elde etmek için kullanıcı ve varsayılan seçenek nesnelerini birleştirmek için kullanışlıdır:

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" değerinin üzerine yazma için geçerli bir değer olduğunu, ancak "tanımsız" ın geçerli olmadığını unutmayın. Bundan yararlanabilirsiniz.

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

Sonuçlar:

A: Foo=null Bar=a

Tek Parametre

Yalnızca bir nesneyi jQuery.extend()iletirseniz, jQuery jQuerynesnenin kendisinin "birinci" parametre (yani: değiştirilecek olan) ve nesnenizin "ikinci" (yani: birinciye eklenecek olan) olduğunu varsayar. . Yani:

console.log( "Before: " + jQuery.foo );
jQuery.extend({foo:1});
console.log( "After: " + jQuery.foo );

Sonuçlar:

Before: undefined
After: 1

3
Öyleyse, b.baz demek {zed: 'dark'}yerine bir nesne olsaydı 2ve siz belirlerseniz r.baz.zed = 'light', değeri ne olurdu b.baz.zed? yani özellikler referansla kopyalanıyor veya birleştiriliyor mu?
ErichBSchulz

4
kendi sorumu cevaplamak b.baz.zediçin light- yani değerler referansla birleştirilir. bir keman
ErichBSchulz

4
harika bir açıklama, +1
Carrie Kendall

2
Umarım resmi belgeler bu kadar net olmalıdır. +1
Thariq Nugrohotomo

2
$ .extend (doğru, nesne1, nesne2); ve $ .extend (nesne1, nesne2); fark ...
Vinay S Jain

27

Bu başka bir nesnenin içeriğini birleştirir . İki nesne iletirsek, ikinci nesne özellikleri birinci nesneye / birinci parametreye eklenir.

Ex: $.extend(object1, object2);

Artık nesne1, nesne2'nin özelliklerini içeriyor

İki nesneyi birleştirmek istiyorsak , ilk parametrede boş nesneyi geçmemiz gerekir.

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

Şimdi newObject hem nesne1 hem de nesne2 özelliklerini içerir .


12

JQuery Belgelerinden

İki veya daha fazla nesnenin içeriğini ilk nesnede birleştirin.

Eklenti bağlamında: Kullanıcı işlev için isteğe bağlı parametreleri ayarlamazsa, bunun yerine varsayılan bir değer kullanılacaktır.


1
Bu cevap bir yorumda yer almalıdır.
Nolo

Teşekkürler JOBG !!
Harsha Vardhan

7

Extend () jQuery'de nasıl çalışır? [Çözülmüş]

jQuery'de derin kopya ve açık kopya var. İlk boole karar verir, derin için doğru ve ışık için yanlış.

Örneğin:

  • jQuery.extend (yanlış, {'a': {'a1': 1}}, {'a': {'a2': 2}})

    sonuç şu olacaktır: {'a': {'a2': 2}} çünkü bu basit bir kopya sadece 1. seviyeyi karşılaştır.

    görüntü açıklamasını buraya girin

  • jQuery.extend (doğru, {'a': {'a1': 1}}, {'a': {'a2': 2}})

    sonuç şu şekilde olacaktır: {'a': {'a1': 1, 'a2': 2}} Bu, birçok nesne düzeyi içeren derin kopyadır (tıpkı dizi düzeyi gibi)

    görüntü açıklamasını buraya girin

  • a, b, c ile jQuery.extend (a, b, c) nesne veya dizidir. Akışın geçersiz kılınması b-> a, c -> a (b overrite a, c override a ...) olacaktır, bu fonksiyon a ve a da değişim değeri verecektir.

Gelişmiş Örnekler:

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

    Sadece bir parametreyi geçmeniz durumunda. jQuery kendini genişletecektir. console.log (jQuery ['number_param']) 1 çıktı verecektir.

    görüntü açıklamasını buraya girin

  • jQuery.extend (1, {'number_param': '2'}); Bu örnek jQuery'nin kendisine eklenmez. İlk parametre boole olmalıdır. Bu durumda, {'number_param': '2'} döndürür ve jQuery güncellenmez.

    görüntü açıklamasını buraya girin

  • jQuery.extend (a, b, c, d, e, f); Sipariş birleştirme olacak. b -> a, c -> a, d -> a, e -> a, f -> a (b geçersiz kılma a, c geçersiz kılma a ...). Ve sonuç dönüşü bir.

    a = {'p': 1} ile. jQuery.extend (a, {'p': 2}, {'p': 3}, {'p': 4}, {'p': 5}) bir döndürür ve a = {'p' 6}. Bu işleve aktarılan parametre sayısı sınırsızdır.

    görüntü açıklamasını buraya girin


1
Gönderen rıhtım "Uyarı: İlk argüman için false geçirilmesi desteklenmez."
Nolo

2

Amaç, var olan bir nesneyi genişletmektir. Örneğin, bir şablon nesnemiz varsa ve bunu daha fazla özellik ekleyerek veya mevcut özellikleri geçersiz kılarak genişletmek istiyorsak, jquery extension yararlı olabilir.

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

};

şimdi onu $.extend(true, {"color":"red"}, carObjectTemplate, {"model": 'amaze'}); genişletmek istersek , bu bize carObjectTemplate'i genişleterek ve

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

ilk boole parametresi true / false, derin veya sığ bir kopyaya ihtiyacımız olup olmadığını belirtmek içindir


Derin veya sığ kopya ne demektir?
Selva Ganapathi

0

Tam olarak bunu yapıyor

Açıklama : İki veya daha fazla nesnenin içeriğini ilk nesnede birleştirin.

JQuery.extend adresinde daha fazlası ()


1
Tek satırlık yanıtlar ve belgelere bağlantılar, yanıt olarak fazla kullanılmaz ve yorumda bırakılmalıdır.
Nolo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.