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..." の行を持つ関数を返すメソッドを作ると良いでしょう。