prototype.js の extend メソッド

prototype.js の提供する便利な機能の一つに、extend によるオブジェクトの拡張があります。prototype.js の中でも、クラスの継承等、随所に使われています。

ところが、これには問題があるんですね。

id:nazoking:20050425:1114374966
id:secondlife:20051007:1128688909
http://la.ma.la/blog/diary_200507101154.htm

各所で指摘されていますように、Object.prototype に対して追加されているメソッドなので、全ての Object オブジェクトが(空のオブジェクトを作ったつもりでも)強制的にこのメソッドを持たされてしまうわけです。これは for in ループで回したい時なんかに困りますね。

こうした意見を反映して、開発版の prototype.js では従来の extend の用法を完全に廃止したようで、

bar.prototype = (new foo).extend({ newval: 'blah' });

とできたものが、一律

bar.prototype = Object.extend((new foo), { newval: 'blah' });

とする方式になっています。

でもそれはちょっと悲しい。せめてクラス定義の時は従来の extend が使えるようにならないもんだろうか。ということで、考えてみました。

Class.create = function ()
{
    return function ()
    {
	this.extend = function (object){ return Object.extend(this, object); };
	this.initialize.apply(this, arguments);
    };
};

このように上書きすることで、あのOO的な、かっこいい extend が再び使えるようになります。Class.create() を使わない抽象クラス定義の場合は、空の関数ではなく、上の "this.extend..." の行を持つ関数を返すメソッドを作ると良いでしょう。