JavaScript Programming 2.0

http://www.hatena.ne.jp/info/tech#tech050826
はてな勉強会のJavaScriptの回を聴いてしまった。以下感想。

JavaScriptはプロトタイプベースでOK?

JavaScriptをプロトタイプベースのオブジェクト指向って言い切っていいのだろうか。
プロトタイプベースっていうと、任意のオブジェクトの複製が作れて、クラスベースのnewによるインスタンスの生成の代わりに"オブジェクトの複製"+"メソッドの動的な追加"でオブジェクトを増やしていく印象がある。JavaScriptではnewで雛形たる関数からオブジェクトを生成するし、またnewが適用できるのも関数に限られていて、プロトタイプベースのイメージにそぐわない。
JavaScriptはクラスベースとプロトタイプベースのハイブリッドで、いわば関数ベースオプジェクト指向だと思ってた。人に説明する時には面倒だからプロトタイプベースっていっちゃうんだけども。あーでも、JavaScriptもプロトタイプベースオブジェクト指向だと言い切ってしまっていいのかな。なんかいいような気もしてきた。まぁ、いいか

忌むべきprototype.js

prototype.jsはヤメテ欲しい。Object.prototypeにextendメソッドをつっこむのだけは止めて欲しい。デファクトとか言わないで欲しい。弊害は http://d.hatena.ne.jp/nazoking/20050425/1114374966 に詳しく書かれている*1。みんなハッシュ代わりに素のオブジェクトをfor inでまわしたりしないのかな?どやってループ書いてるんだろう。まぁ、いいか。
Class.createで生成するのをObjectじゃなくてClassObjectとか独自のにして、extendはClassObjectのprototypeだけにつっこむ、ていうのでは駄目ですか?それなら素のオブジェクトには影響なくなるのに。まぁ、Object.extendをそのまま使おうよ。
あ、もしかして、prototype.jsライブラリ読んだあと、自前のソースを書き始める前に、delete Object.prototype.extend ってやったら弊害なくなる?今度試してみよう。

どうでもよいおまけ

いくらなんでも、JavaScriptのオブジェクトに付与する関数にクラスの名前を含めるのはダサいですよ。聴いたときは思わず吹いてしまった。CでOOPしてるんじゃないんだから…。あとそれから、ActionScriptECMAScriptを元にしているのでJavaScriptに似ているのはあたりまえ。