読 prototype.js 感想文2
もうちょっと prototype.jsを読んでみました。意外と面白さを感じたのは、継承、イテレータ、Form操作などの地味なところ。
前回を読んでいただくと、だいぶprototype.jsを読み進められるようになると思うのですが、もうちょっとだけ補足。
call と apply は、JavaScript標準の継承を実現するメソッドです。普通に(?)作業してるとあまり使わないようなモノなので、存在自体を知らない人もいるかもしれません(実際、私がそうでした・・orz)。
このメソッドは、一般的なオブジェクト指向言語の super のような働きをするようです。くわしくは、とほほさんのページで。
applyの引数に関数のハッシュを渡してやれば、複雑なクラスも継承できるはずなのですが、改めて Object.extendsを定義したのは、なんでなのでしょう。わかりやすさ?・・・違いをおしえてくださる方、お願いします。
ということで、継承に関しては2つの方法が混在していますが、あとは、特に引っかかるところはなさそうなので、読んで試して読んで試して!
prototype.jsの作者は、
よっぽどイテレータを使いたかったんだろうなぁw。
と思わせるほど、配列やハッシュ、はたまた、Numberクラスの拡張にいたるまで、キメ細やかにEnumarableのメソッドを定義しています。prototype.jsの6分の1は、Enumerable関係のコード。
Numberクラスの拡張メソッド times や、ObjectRangeクラスは、Rubyスタイルに近づけたかったのでしょう。これは非常に楽で、for文で書いてた処理が、こんな風に書くことができます。
new Number(100).times(
function(index){
document.write(index);
}
)
var n = 100;
n.times(
function(index){
document.write(index);
}
)
$R(0,100).each(
function(value,index){
document.write(value);
}
)
6分の1という配分、Ajax関係(サーバサイドとの非同期通信)のコードも、同じくらい。prototype.jsは「Ajaxライブラリ」なんていう言われ方しますが、実は、Ajaxはそれほどのウェイトではないんだということに気づきます。
私の場合、JavaScriptを書くときは必ずprototype.jsを使うことにしているので、もはや旧来のfor文は書く気がしません。
Flash ActionScriptではやむを得ず書かなければならないのですが、これも、ActionScriptに移植してしまえばいいだけですもんね。そのうち作っちゃおうと思ってます。もしかしたら既にあるのかな?
意外とあるようでなかった、HTMLタグを剥がしたり(サニタイズ)するためのメソッドがStringクラスに付加されてます。PHPにあるようなヤツです。JavaScriptの用途からして、当然あると思っていた機能が、従来はなかったんですね。盲点をつかれたようで、はっとしました。
シンプルな発想だけど、これはいいなー!と思ったのが、Form.serialize。HTML Formの内容をリクエストパラメータ形式(name1=value1&name2=value2..)に変換してくれるモノです。
RESTだろうがJSONだろうが、この形式は必須なわけで、リクエストパラメータの文字列を作るコードは何度となく書いてきましたが、
var params = Form.serialize('formId')
で、一発変換です。これをマネしてXML形式にシリアライズするメソッドを作っても便利かもしれません。
serializeということは、もしや、アップロードファイルも!?と思いきや、さすがにそれはサポートしてませんでした。
これほど多くのブラウザに対応しているのだから、さぞ条件分岐が激しいのかと思っていましたが、ソースコードを見ると、とてもスマート。その理由は、Try.these と OR演算子(||)です。後者は、スクリプト慣れしている人にはお馴染のスタイル。前回も紹介したTry.theseも、いい味出してますので、読んでみてください。
以上、残りは、Eventの拡張とObserver、DHTMLのための便利クラスなどです。あと肝心のAjaxクラス。それほどこのあたりには面白みを感じませんでした。
prototype.jsを読んでると、デザインパターンが騒がれたときのことを思い出します。難しいことを言ってるわけではなく、定石集というか、統一というか、そういう類のモノなのかもしれません。
高度なHackと言うよりは、親しみやすさの方を、敢えて優先しているような、そんな感じです。

