jQueryでextend()はどのように機能しますか?


119

私はこれをプラグインで見ました:

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

それはどのように機能しますか?

何をしextend()ますか?


1
これについてはjQueryのドキュメントで読むことができますが、これの方がわかりやすいと思います。
ifaour

jQueryには優れたドキュメントがあります。api.jquery.com 検索jQueryフィールドにメソッド名を入力するだけです。
user113716 2010

42
トッドは、jQuery.extendの使い方ではなく、jQuery.extendの仕組みを知りたいと思います。たとえば、各プロパティをループしてまったく新しいオブジェクトを作成したり、プロトタイプ継承を素晴らしい方法で使用したりします。
b01 2013年

回答:


178

複数のパラメーター

ドキュメントは、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で機能することを目的としています。必要に応じて、alert()または他の出力関数に置き換えてください)。

結果は次のとおりです。

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()がわかります。

  • 最初のパラメーターによって提供されるオブジェクトから開始します。
  • 2番目のパラメーターのプロパティを追加します。プロパティが最初のパラメータにすでに存在する場合、それは上書きされます。2番目のパラメーターのオブジェクトは変更されません。
  • 後続のパラメーターで上記を繰り返します。
  • 最初のパラメータを返します。

これは、ユーザーとデフォルトのオプションオブジェクトを組み合わせてオプションの完全なセットを取得するのに役立ちます。

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」は上書きに有効な値ですが、「未定義」は上書きできないことに注意してください。これを利用できるかもしれません。

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

単一パラメーター

にオブジェクトを1つだけ渡すとjQuery.extend()、jQueryはjQueryオブジェクト自体が「最初の」パラメーター(つまり、変更されるパラメーター)であり、オブジェクトが「2番目のパラメーター」(つまり、最初に追加するパラメーター)であると想定します。 。そう:

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 2013年

4
自分の質問に答えるために、b.baz.zedだろうlight-すなわち値は、参照することによりマージされます。フィドルを
ErichBSchulz 2013年

4
すばらしい説明、+ 1
Carrie Kendall 14

2
公式文書がこれと同じくらい明確であるべきだと思います。+1
Thariq Nugrohotomo

2
$ .extend(true、object1、object2); および$ .extend(object1、object2); 違い...
Vinay S Jain

27

あるオブジェクトのコンテンツを別のオブジェクトマージします。2つのオブジェクトを渡す場合、2番目のオブジェクトプロパティが最初のオブジェクト/最初のパラメーターに追加されます

Ex: $.extend(object1, object2);

これで、object1にはobject2のプロパティが含まれます

2つのオブジェクトマージする場合は、最初のパラメータで空のオブジェクトを渡す必要があります

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

これで、newObjectにはobject1とobject2の両方のプロパティが含まれます


12

jQueryドキュメントから

2つ以上のオブジェクトの内容を最初のオブジェクトにマージします。

プラグインコンテキスト:ユーザーが関数のオプションパラメータを設定しない場合、代わりにデフォルト値が使用されます。


1
この回答はコメントに含める必要があります。
Nolo

ありがとうJOBG !!
Harsha Vardhan

7

extend()はjQueryでどのように機能しますか?[解決済み]

jQueryにはディープコピーとライトコピーがあります。最初のブール値がそれを決定します。深い場合はtrue、光の場合はfalseです。

例えば:

  • jQuery.extend(false、{'a':{'a1':1}}、{'a':{'a2':2}})

    結果は次のようになります:{'a':{'a2':2}}これは単純なコピーなので、レベル1を比較するだけです。

    ここに画像の説明を入力してください

  • jQuery.extend(true、{'a':{'a1':1}}、{'a':{'a2':2}})

    結果は次のようになります。

    ここに画像の説明を入力してください

  • jQuery.extend(a、b、c)とa、b、cはオブジェクトまたは配列です。フローオーバーライトはb-> a、c-> a(bオーバーライトa、cオーバーライドa ...)となり、この関数はaを返し、値も変更します。

高度な例:

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

    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になります。

    a = {'p':1}。jQuery.extend(a、{'p':2}、{'p':3}、{'p':4}、{'p':5})はaを返し、a = {'p': 6}。この関数に渡されるパラメーターの数は無制限です。

    ここに画像の説明を入力してください


1
ドックから「警告:最初の引数にfalseを渡すことはサポートされていません。」
Nolo

2

目的は、既存のオブジェクトを拡張することです。たとえば、テンプレートオブジェクトがあり、それをさらにプロパティを追加するか、既存のプロパティをオーバーライドして拡張する場合、jquery extendが役立ちます。

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は、深いコピーまたは浅いコピーが必要かどうかを示します


深いコピーまたは浅いコピーはどういう意味ですか?
Selva Ganapathi

0

それはまさにこれを行います

説明:2つ以上のオブジェクトのコンテンツを最初のオブジェクトにマージします。

jQuery.extend()の詳細


1
1行の回答とドキュメントへのリンクは、回答としてはあまり役に立ちません。コメントに残す必要があります。
Nolo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.