JavaScriptでPHPっぽいクラスを再現する

Posted by Hiraku on 2010-07-19

ちょっと間違いを見つけたので修正中です

仕事でJavaScriptを少し書いていたのですが、自由度がすごすぎてPHPerな私はどうにも慣れないです。特に以下の2点。

  • クラスが存在しない
  • public / privateがない

本当はプロトタイプを使いこなし、JavaScriptらしい書き方をするべきなんですが、逆にPHPみたいなクラスをJavaScriptで再現できるか考えてみました。

JavaScriptで「クラスみたいなもの」を実現する方法は幾度も議論されていて、パターンは決まっています。ここでは、私的に一番わかりやすいパターンを記します。

  • 使い捨て無名関数でまとめ、クラス定義の範囲をわかりやすくする
  • クロージャを併用してprivateを再現する
  • そこそこの記述量で実現できる範囲に留める(なるべくJavaScriptそのものの機能を使う)
  • 多重継承を可能にする(jsはインターフェースが無いからね。。。)

サンプル

spidermonkeyで作ったので、print関数が紛れています。ブラウザで実行する場合はfunction print(o){document.write(o)}とか、適当な出力関数を定義しておいてください。

サンプルのクラス図

jsclass.png

注意点

いくつかありますが、解説は長くなりそうなので別記事にします。

  • これはクラスみたいに扱えるオブジェクトを作っているに過ぎない。オブジェクトなので、あとから定義を変更できるし、削除されてしまうこともある。(言語的に無意味な存在なのだよ)
  • protectedは実現できない。継承して使いたいときはpublicにしておくしかない。
  • private → constructor → public の記述順序を変えることはできない。
  • public methodでも「self」が使えるが、applyやcallに支障を来すのでやめた方がいい。
  • コンストラクタに「_(アンダーバー1つ)」みたいな適当な名前を付けているのは、単なる個人的な好みです。initでも__constructでもクラスと同名でも好きな名前にしていい。どうせクラス定義の外で使われることはない。

参考文献

主にこちらの書き方を組み合わせて、newできるように修正しただけです。

最近になってDouglus Crockfordの偉大さがわかるようになってきました。swiss()しかり、clone()しかり、jsonしかり。色々発見しすぎだろこの人。

keyword: javascript

codingの最新記事