[JavaScript] JavaScriptもオブジェクト指向言語だ。

最近仕事でJavaScriptを触りまくりです。
前に調べて知ってたんですけど、JavaScriptは動的にオブジェクトの定義ができるんですね。まあ詳しくはオブジェクト指向言語としてのJavaScriptとか、JavaScriptによるオブジェクト指向プログラミングを見てください。


まずJavaScriptのオブジェクトはMapのように属性を保持します。面白いのは属性として値やオブジェクトだけでなく、関数ポインタも扱えます。まあ正確には関数やメソッドもオブジェクトとして扱われるらしいので、実際関数ポインタというものがあるわけではないみたいなのですが。


ただ残念ながらイベントハンドラとしてのメソッドが実行されるときのthisは、そのメソッドを定義しているオブジェクトではなく、イベントハンドラを呼び出したオブジェクトとなってしまうのです。


これが慣れないと結構面倒くさいんですけど、イベントハンドラに渡される引数を、イベントハンドラを定義するオブジェクト(呼び出されるオブジェクト)が指定することができます。このオブジェクトに呼び出されるオブジェクト自身の参照を属性として設定しておけば呼び出されたオブジェクトのthisにあたるオブジェクトを取得できます。


まあこんなことに悩みつつJavaScriptに触っているわけですが、JavaScriptでは継承もできない*1し、public、privateとかのvisibilityを指定することもできませんが、オブジェクト指向なんだなーと思いました。


これは別に大した理由があるわけではなく、ただ単にオブジェクトが使えるからってだけなんですが、例えば継承の仕組みを自身で作ることも不可能ではないわけんで、完全ではないけどオブジェクト指向言語なんだなーと。Closureも定義できるからSmalltalkに似てる気もするし。オブジェクト指向スクリプト言語ってSmalltalkしか知らないんですけどね。あ、Closureと言えばGroovyもできるよね。


Javaのimportみたいな依存関係を表せる記述ができるといいなー。
いつもの事ながらまとまりがないっすね。すんません。

*1:前述のサイトに「メソッドの継承」は紹介されていますが、型の同一性を意味する「クラスの継承」は無理みたいです