jQueryの継承(extend)

2010/06/18

JavaScriptのわかりにくさと言うか、面倒くさい実装の一つ「拡張」 そもそも「クラス」という概念ではなく「プラグイン」と定義している。

という事で、プラグイン拡張をjQuery API jQuery.extend()でお勉強

■拡張の定義


var object = $.extend({}, object1, object2);

■最初のオブジェクト(objects1)を変更して、object1とobject2をマージ


var object1 = {
  apple: 0,
  banana: {weight: 52, price: 100},
  cherry: 97
};
var object2 = {
  banana: {price: 200},
  durian: 100
};

$.extend(object1, object2);

実行結果

object1 === {apple: 0, banana: {price: 200}, cherry: 97, durian: 100}

object1のbananaオブジェクトが、object2のbananaオブジェクトで上書きされている

■最初のオブジェクト(objects1)を変更して、objects1、objects2を再帰的にマージ


var object1 = {
  apple: 0,
  banana: {weight: 52, price: 100},
  cherry: 97
};
var object2 = {
  banana: {price: 200},
  durian: 100
};

$.extend(true, object1, object2);

実行結果

object1 === {apple: 0, banana: {weight: 52, price: 200}, cherry: 97, durian: 100}

bananaオブジェクトの中身まで検証し、object2の値が優先で上書きされる

■settingsを変更して、defaultsとoptionsをマージ


var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);

実行結果

settings == { validate: true, limit: 5, name: "bar" }

■defaultsを変更せずに、defaultsとoptionsをマージ


var empty = {}
var defaults = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
var settings = $.extend(empty, defaults, options);

実行結果

settings == { validate: true, limit: 5, name: "bar" } empty == { validate: true, limit: 5, name: "bar" }

マージされたオブジェクトはemptyに格納されている