jQuery.extendでオブジェクトを拡張する

基本

オブジェクト設定のデフォルトを定義しておき、後から設定されるオプションを上書きする場合。

var defaultValue = { value1: "default1",value2: "default2"};
var option = { value1:"vallue1"};
var extended = jQuery.extend(defaultValue,option);

extended.value1はoptionの内容で上書きされる。extended.value2はdefaultValue.value2の内容になる。
分でjquery拡張を書く時なんかに使う。

クラスの継承

基本クラスにメンバーを追加する、あるいはメソッドをオーバーライドする。
間違ったやり方はこう。

var Parent = function(){ ... };
Parent.protorype = { ... };
var Child = function(){ ... };
Child.prototype = { ... };
jQuery.extend(Child,Parent);

多分意図とは逆にChildに定義したメンバーがParentで上書きされてしまう。
これもだめ。

var Parent = function(){ ... };
Parent.protorype = { ... };
var Child = function(){ ... };
Child.prototype = { ... };
var extended = jQuery.extend({},Parent.prototype,Child.prototype);

意図としては"var obj = new Child()"したいのであって、これだと"var obj = new extended()"じゃないと使えない。
もしかしたら "var Child.prototype = jQuery.extend({},Parent.prototype,Child.prototype);"ならいけるかも。でも冗長。

var Parent = function(){ ... };
Parent.protorype = { ... };
var Child = function(){ ... };
 = { ... };
jQuery.extend(Child.prototype,Parent.prototype,{ /* 拡張メンバー */ });

こう書けば、意図通りに動作する。Childで上書きしなかったメンバーもChild内でthis.hogeして使える。
ただし、この書き方をするとjsdocのコメントがうまく入らなくなるので、昨日の日記を参照。
あと、オーバーライドしたメンバーの親を使う場合どうするのか、は未だ試してない。

追記:
最後の例が間違っていたので修正。
要するに

  • まだ空であるChildのprototypeに
  • 既に定義しているParent.prototypeを上書きし
  • さらに追加メンバーを上書きする。

って事。