全3776文字

JavaScriptは、長い歴史を持ちながらも常に進化を続けている。最新動向を踏まえて筆者の個人的な見解を交えつつ、Q&A形式でJavaScriptにまつわる素朴な疑問に答える。

Q7:そもそもクラスを定義する必要はあるのですか?
関数だけではダメなのですか?

A7:場合によっては関数だけでもよいと思います。

 クラスからはいくつものオブジェクトを生成できます。そして、生成した各々のオブジェクトには、「処理」と各々の「データ」が含まれています。

 例えば、リスト4でScoreクラスから生成したtaroオブジェクトは、「田中太郎」と「56」というデータを保持し、それを表示する処理であるprintメソッドを持っています。そして、「taro.print()」のように、taroオブジェクトが持つprintメソッドを実行すれば、「田中太郎さんは56点です。」と表示されます。

 これと同じような処理をクラスを使わずに関数だけで実装するとしたら、リスト5のようになります。名前と点数を引数で受け取るprint関数を定義し、print関数にデータを渡します。データ("田中太郎"と56)と処理(print関数)は独立した存在です。よって、「print(name, point);」のように、処理の実行時にデータと処理を結び付ける必要があります。

リスト5 ●クラスを使わずに関数だけで実装
リスト5 ●クラスを使わずに関数だけで実装
[画像のクリックで拡大表示]

 クラスを定義するやり方と関数だけのやり方は、どちらの方がよい、というものではなく、適材適所で使い分けるのがベターです。複数の種類のデータをワンセットで扱いたい場合は、クラスを使った方が便利です。

 一方、扱うデータの種類が少ない場合は、わざわざクラスを定義せずに、関数だけを用意しても問題ないでしょう。

staticメソッドで関数をクラスにまとめる

 オブジェクトを生成せずに「クラス名.メソッド名()」で呼び出せる「staticメソッド」という機能があります。staticメソッドはリスト6のprintメソッドのように、メソッド名の前に「static」を付けることで定義できます。

リスト6 ●staticメソッドの例
リスト6 ●staticメソッドの例
[画像のクリックで拡大表示]

 このprintメソッドは次のように呼び出せます。

[画像のクリックで拡大表示]

 そして、staticメソッドを使って、同じカテゴリーに属する複数の関数を1つのクラスにまとめるというテクニックがあります。例えば、JavaScriptの組み込みオブジェクトである「Mathオブジェクト」はこのテクニックを使っています。

 Mathオブジェクトのメソッドはオブジェクトを生成することなく、次のように利用できます。

[画像のクリックで拡大表示]

 Mathオブジェクトには数学系の関数がstaticメソッドとしてまとめられていて、オブジェクトを生成することなくすぐに使えるようになっています。このようなクラスに属するstaticメソッドは、事実上はグローバルに使える関数と言えます。