ES6で追加されたclass
構文により、JavaScriptでもクラスベースの記法でオブジェクト指向プログラミングが可能になりました。従来はプロトタイプ継承を用いてオブジェクトの雛形を作っていましたが、class
構文はこれを抽象化し、他の言語に近い記法でコンストラクタやメソッド、継承(extends
)を記述できます。
JavaScriptのクラスはシンタックスシュガーであり、内部的にはプロトタイプチェーンを利用した仕組みです。しかし開発者はclass Foo { ... }
と書くだけでクラスを定義でき、new Foo()
でインスタンスを生成できます。クラスにはコンストラクタconstructor
メソッドや、プロトタイプメソッド(クラス内に定義したメソッド)が含まれます。さらにextends
キーワードでクラスを継承し、super
呼び出しで親クラスのコンストラクタやメソッドを呼ぶことができます。
JavaScriptにおけるクラスと継承の例を示します。Person
クラスを定義し、それを継承したStudent
クラスを作成します。
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`こんにちは、${this.name}です。`);
}
// Personクラスを継承したStudentクラス
class Student extends Person {
constructor(name, age, grade) {
super(name, age); // 親クラスのコンストラクタを呼び出し
this.grade = grade;
}
}
study() {
console.log(`${this.name}は勉強しています。`);
}
const alice = new Person("Alice", 30);
alice.greet(); // "こんにちは、Aliceです。"
const bob = new Student("Bob", 20, "A");
bob.greet(); // "こんにちは、Bobです。" (親クラスのメソッドを利用)
bob.study(); // "Bobは勉強しています。"
解説:
上記のPerson
クラスは、constructor
で名前と年齢を受け取りプロパティname
,
age
に代入しています。greet()
メソッドはインスタンスのname
を使って挨拶を表示する機能です。Student
クラスはPerson
をextends
しており、新たにgrade
(成績や学年などを表す)プロパティとstudy()
メソッドを追加しています。Student
のコンストラクタではsuper(name, age)
を呼び出して親Person
の初期化を行った後、自身のgrade
をセットしています。
生成したbob
(Studentインスタンス)は、Person
から継承したgreet()
メソッドと、自身で持つstudy()
メソッドの両方が利用可能です。このように、クラス構文を使うことで継承関係を簡潔に表現でき、オブジェクト指向のパターン(継承による機能拡張など)をJavaScriptで実践しやすくなります。
TypeScript版では各プロパティやメソッドに型情報を付与しています。たとえばname: string;
と宣言することでname
プロパティは文字列型であることが明示され、誤った型の値を代入しようとするとコンパイルエラーになります。クラスの構文自体はJavaScriptと同様ですが、このような型チェックが加わることでより堅牢なコードを書くことができます。