2024-09-30
🔷TypeScriptの学習_8 (クラス1)
クラスとはオブジェクトの雛形
クラスを元にオブジェクトを生成することで複数のオブジェクトのデータ構造を同一にする事ができる
クラスによって生成されたオブジェクトは、データ構造は同一だが、それぞれ別のもので別のデータを格納できる
クラスは型注釈にも使用できる
変数などの型注釈にクラス名を指定することが可能で、指定した型のオブジェクトでない場合はエラーとなる
クラスにはデータ(プロパティ)だけではなく、クラスに関連する処理(メソッド)を含めることもできる
プロパティ、メソッドのことをメンバという
※なお、クラス名は大文字で始まるのが一般的
クラスの定義
クラスの定義には宣言と式がある
code:クラス宣言
class クラス名 {
// クラス本体(プロパティ、メソッドなどの記述)
}
code:クラス式(クラスは無名だが変数に代入される)
const 変数名 = class {
// クラス本体(プロパティ、メソッドなどの記述)
}
プロパティの記述
プロパティ名: データ型 = 初期値
プロパティは初期値から型推論が効くが、型を明示する事もできる
変数ではないのでconstやletといったキーワードは使用しない
メソッドの記述
code:メソッド
メソッド名(引数: 引数の型, ...): 戻り値の型 {
// 処理
}
メソッドの記述にはfunctionキーワードは必要ない
処理内でクラス内部のプロパティにアクセスする際はthisを使用する
this.プロパティ名
オブジェクトの生成
newキーワードを使用してオブジェクトを生成する
const 変数名 = new クラス名();
クラスからnewでオブジェクトを生成することをインスタンス化といい、生成されたオブジェクトをインスタンスという
クラスを元に生成されたオブジェクトのプロパティにはオブジェクト名.プロパティ名でアクセスできる
プロパティ同様、メソッドの利用はオブジェクト名.メソッド名()のように.による記述でで可能
コンスタラクタ
オブジェクトの生成時(newのタイミング)で実行される特殊なメソッドがコンストラクタ
コンストラクタはconstructor()という名前のメソッドで定義される
コンストラクタは引数は設定できるが、戻り値は設定できない
引数を設定した場合、newの際には必ずコンストラクタで設定された引数を渡す必要がある
code:コンストラクタの例
class Test {
name: string;
constructor(name: string) {
this.name = name;
}
}
GetterとSetter
クラスのプロパティの値を取得(Getter)したり設定(Setter)したりするためのメソッド
ゲッターやセッターを使用することでクラスの内部データを安全に操作する事ができ、データの整合性を保てる
ゲッターやセッターのことをアクセッサプロパティといい、通常のプロパティをデータプロパティという
なお、ゲッターやセッターのアクセッサプロパティと、通常のデータプロパティはプロパティ名を同一にできないと言うルールがある
Getter
クラスのプロパティの値を取得するためのメソッド
すでにあるプロパティの値に限らず、計算などの処理を行った結果を返すメソッドとしても使える
記述の仕方は、getで始まり、取得したいプロパティ名が続く
code:Getter構文
get プロパティ名() {
return 値;
}
実際に取得する時はプロパティの参照の時と同様にオブジェクト名.Getterのプロパティ名で呼び出せる
なお、通常のプロパティとは異なるため、呼び出しのみで値の設定はできない
Setter
クラスのプロパティの値を設定するためのメソッド
すでにあるプロパティの値の設定だけでなく、追加の処理や検証をおこなために使うこともできる
記述の仕方は、setで始まり、設定したいプロパティ名が続く
code:Setter構文
set プロパティ名(引数: 型) {
プロパティに値を設定する処理
}
戻り地は不要だが、引数が必要
値を設定する時はオブジェクト名.Setterのプロパティ名 = 設定したい値で設定する
アクセス修飾子
アクセス修飾子とはクラス内のメンバのアクセス範囲を制御するキーワード
プロパティやメソッドの定義時にプロパティ名やメソッド名の前にキーワードを付加して使用する
public
どこからでもアクセス可能
オブジェクトから読み書きが可能
修飾子がない場合もpublicとみなされる
private
クラス内でのみ読み書き可能
Setterで値をセットする時に検証を行うようにしても、対象のプロパティがpublicで直接読み書き可能だったら意味がなくなるが、privateにすることでSetter以外から値を書き換えられなくなる
privateのメンバに関してはprivateであることを示すためにメンバ名の頭に_をつける習慣がある
定義時に、privateをつけなくても#を頭につけることで外部からのアクセスが完全に制御される
ソースコードファイル:
#TypeScript