クラスもどきを作るライブラリを作ってみた

あたりを読んで、たまにはライブラリ的なものを作ってみようと思い立って作ってみた。上記記事よりJavaScript的なクラスを作成できると思う。

コード

jsdoc-tookitの練習としてコメントも入れているのもあって、最初は数十行で済ませるつもりが100行オーバーしてしまった。
一応、Firefox4.0とGoogleChromeで動作は確認したが、ECMAScript 5th 入りまくり、かつ、__proto__を使っているので一般Webではまだ使えないかも。(ダメじゃん)


特徴

特徴というほどでもないけど

  • initメソッドがインスタンス作成時に呼ばれる
  • prototypeによる継承が可能
    • プロパティは基本的には上書きせずに、prototypeに突っ込んでいる
      • 元記事はインスタンス作成時に毎回上書きが走って非効率に思える
    • instanceofを自然に使える
    • 継承元のprototypeに同名の関数がある時は、superプロパティを設置して参照できるようにしている
      • 参照: 下記サンプルコードのinitメソッド
      • arguments.callee.super.apply(this, args)というように書ける
      • 元記事のはトリッキーなことしているけど、その必要はない
  • 作るのはインスタンスではなく、Functionコンストラク
    • new演算子はあってもなくてもインスタンスを作成できる(たまに自分もnewを付け忘れることがあるので)

あとは、Mix-in的なものは一応関数は書いたけど(Class.update関数)使用していない(テストもしてない)

サンプルコード

元記事に関して

コードを書き終わった後で読んだんだけど、言いたいことはnew を不当に貶める陰謀と JavaScript におけるクラスの継承構造の話 - vivid memoで言ってくれている。

重ねて書くことになるけど、元記事でやっているobject関数は「クラス」なんて作ってない。「インスタンス」を作っている。いや正確には作っていると言えるんだけど、毎回作って即インスタンスを作成して返すということをしている。非常に非効率だと思う。JavaScriptでわざわざクラス的なものを作ってどうこうする時は大量にオブジェクトを作成しないといけない場合だと思うが、オブジェクト一個作るのに毎回ループが発生していてはやっていられないと思う。

あと、僕はnew演算子は好きです。書き忘れが発生してorzすることはあるけど。何故好きかというと、コードを読んでいてインスタンスを作成していることが明確に分かるから。個人的には可読性が向上すると思っていて、何故そんなに貶められているのか理解できない。