クラスもどきを作るライブラリを作ってみた
- newを封印して、JavaScriptでオブジェクト指向する(1) - 泥のように
- newを封印して、JavaScriptでオブジェクト指向する(2) - 泥のように
- newを封印するべき4つの理由 - 泥のように
あたりを読んで、たまにはライブラリ的なものを作ってみようと思い立って作ってみた。上記記事よりJavaScript的なクラスを作成できると思う。
コード
jsdoc-tookitの練習としてコメントも入れているのもあって、最初は数十行で済ませるつもりが100行オーバーしてしまった。
一応、Firefox4.0とGoogleChromeで動作は確認したが、ECMAScript 5th 入りまくり、かつ、__proto__を使っているので一般Webではまだ使えないかも。(ダメじゃん)
特徴
特徴というほどでもないけど
init
メソッドがインスタンス作成時に呼ばれる- prototypeによる継承が可能
- プロパティは基本的には上書きせずに、prototypeに突っ込んでいる
- 元記事はインスタンス作成時に毎回上書きが走って非効率に思える
- instanceofを自然に使える
- 継承元のprototypeに同名の関数がある時は、
super
プロパティを設置して参照できるようにしている- 参照: 下記サンプルコードの
init
メソッド arguments.callee.super.apply(this, args)
というように書ける- 元記事のはトリッキーなことしているけど、その必要はない
- 参照: 下記サンプルコードの
- プロパティは基本的には上書きせずに、prototypeに突っ込んでいる
- 作るのはインスタンスではなく、Functionコンストラクタ
あとは、Mix-in的なものは一応関数は書いたけど(Class.update
関数)使用していない(テストもしてない)
サンプルコード
元記事に関して
コードを書き終わった後で読んだんだけど、言いたいことはnew を不当に貶める陰謀と JavaScript におけるクラスの継承構造の話 - vivid memoで言ってくれている。
重ねて書くことになるけど、元記事でやっているobject
関数は「クラス」なんて作ってない。「インスタンス」を作っている。いや正確には作っていると言えるんだけど、毎回作って即インスタンスを作成して返すということをしている。非常に非効率だと思う。JavaScriptでわざわざクラス的なものを作ってどうこうする時は大量にオブジェクトを作成しないといけない場合だと思うが、オブジェクト一個作るのに毎回ループが発生していてはやっていられないと思う。
あと、僕はnew演算子は好きです。書き忘れが発生してorzすることはあるけど。何故好きかというと、コードを読んでいてインスタンスを作成していることが明確に分かるから。個人的には可読性が向上すると思っていて、何故そんなに貶められているのか理解できない。