Kinopyo Blog

プログラマとしてRuby, Rails, iPhone, iPad,Macなどなどと向き合う日々のログポース

jQueryの$.extendに注意:$.extend({},target,option)と$.extend(target,option)の違い

2009年11月01日 by kinopyo | jQuery


jQueryの$.extendはとても便利な機能です。

jQueryのプラグインを作成する場合は以下の二つを利用します。

$.extend(object) //jQueryそのものを拡張する
$.fn.extend(object) //jQueryエレメントに新しいメソッドを追加する。
//(典型的なjQueryプラグインの作成方法)


今回検討するのは第三の使い方です。

$.extend(target,option,...);

これは第一のパラメータのオブジェクトをどんどん拡張する意味です。

実際のプログラミングではこんな使い方が両方あります。

$.extend(target, option);
$.extend({}, target, option);


違いは何でしょうか?


$.extend(target, option);

これはtargetそのものを拡張する意味です。

実行後targetオブジェクトは変更(拡張)されます。


実例として、例えばプロジェクトにトップレベルの空のConstansクラスがあります。

その下で各モジュール要のconstantsが定義されていて、

それをトップのConstantsに拡張します。

$.extend(constants,subConstants1,subConstants2...);

落とし穴:

var defaults = {};
var option = {};
var opts = $.extend(defaults,option);

上記ではdefaultsが変更され、わざわざ変数optsに代入する意味もなくなります。


$.extend({}, target, option);

これは空のオブジェクトを拡張する意味です。

実行後、targetもoptionもかわらりません。

最も多く使われている実例は、jQueryのプラグインの開発です。

あるデフォルトのoptionを定義し、

ユーザが自分のニーズにあったoptionがあればそれを適用する感じです。

ここで大事なのは定義したデフォルトのoptionはかわりたくないのです。

なので、最初に空のオブジェクトを拡張しそれを何かの変数に

リファレンスをアサインします。


var defaults = {};
var option = {};
var opts = $.extend({},defaults,option);

これで変数optsは求めているデフォルトoptionとユーザが定義したoptionをマージ、拡張したものとなります。

Tags:

You can leave a response, or trackback from your own site.

関連記事