JavaScriptでクラスを定義する

擬似的な抽象クラス、継承関係を持つクラスを定義する方法。

抽象クラスAnimalを定義

いくつか解説します。

9行目:自インスタンスがAnimalクラスのインスタンスでない場合、自インスタンスを生成します。これはnewを付けずにAnimal()関数を実行した場合でも、インスタンスを生成させる為に行っている処理です。誤ってnew を付けずにコンストラクタを実行した際の事故防止です。

19行目:自インスタンスがAnimalクラスのインスタンスであった場合、例外を投げています。これは、Animalクラスを抽象クラスとして運用したいので、インスタンスを生成させたくない為に行っています。

34行目:getSound() メソッド実行時に例外を投げています。これは、サブクラスでこのクラスをオーバーライドしていなかった場合に、オーバーライドを強制させる為に行っています。

具象クラスCatを定義

17行目:スーパークラス Animalのコンストラクタを実行しています。余談ですが、スーパークラスのメソッドを実行するには以下のように記述します。

<SuperClass>.prototype.<MethodName>.call(this<, arg>);

21行目:サブクラスCatのprototypeにスーパークラスAnimalを設定し、継承関係を構築します。

具象クラスDogを定義

Catクラスと同様。

具象クラスHorseを定義

29行目:意図的にgetSound()メソッドをオーバーライドしていません。実行時に例外エラーとなります。

テスト

正常系。

実行結果。

異常系。

Horseクラスのインスタンスを生成します。

実行結果。

HorseクラスではgetSound()メソッドを意図的にオーバーライドしていませんでした。よって、AnimalクラスのgetSound()メソッドに実装した例外生成処理が行われ、エラーとなっています。

Animalクラスのインスタンスを生成します。

実行結果。

Animalクラスのコンストラクタでインスタンスのクラスを判定し、Animalクラスのインスタンスであれば例外を生成するように実装しています。よって、例外生成処理が行われ、エラーとなっています。

最後に

このような形で擬似的な抽象クラス、継承関係を持つクラスの実装を行えます。あくまで一例です。他にも良い実装方法があります。興味が湧いたら調べてみると良いでしょう。

今回作成したファイルへのリンクです。必要に応じてダウンロードして動かしてみて下さい。