prototype.js の Class 拡張試案について (仕様変更案)
Class.abstract と Class.concrete を統一すべきか
id:reinyannyan:20051028:p1 等で Class.abstract() と Class.concrete() というクラス作成メソッドを提案しました。
prototype.js で、抽象クラスを定義するのに空関数を使っているのがちょっと格好悪いなと思ったのがその動機でした。
でも、この二つのメソッドの違いというのは基本的に initialize を呼ぶか呼ばないか、ということだけですので、initialize を呼ぶ前に存在を確認するようにすれば、容易に一本化できるわけです。
問題は、両者の使い分けが便利かどうか、あるいは必要かどうかですよね。
Ruby が具象と抽象の区別を仕様上行わないことを考えると、Ruby と密な関係にある Prototype においても同様にすべきなのかも知れません。
一文でのクラス定義・宣言
興味深い Prototype の Class 拡張の案がこちらで示されています:
http://wiki.script.aculo.us/scriptaculous/show/ExtendClass
特に注目したいのは、クラス定義の中身を Class.create() に引数として渡し、".prototype" への代入はメソッド側で自動的にやってくれる、という改良です。
従来、宣言と定義をこのように二文で行っていたものが:
var Klass = Class.create(); Klass.prototype = { // 定義 };
一文で済むようになるわけです:
var Klass = Class.create( { // 定義 });
これはなかなか素晴らしいんじゃないでしょうか? 本家で取り入れられて欲しいものです。