アクセス修飾子 (access modifier)
JavaやPHPなどの言語では、フィールドやメソッドにprivate
, protected
, public
を指定できます。JavaScriptでもprivate
のようなプロパティを実現するためにプライベートクラスフィールドという仕様が実験的に導入されはじめてはいますが、現状はJavaのようなアクセス修飾子はありません。TypeScriptにはJava風のアクセス修飾子があります。
アクセス修飾子 | 説明 |
---|---|
(宣言なし) | publicと同等 |
public | どこからもアクセス可能 |
protected | 自身のクラスとサブクラスからアクセス可能 |
private | 自身のクラスのみアクセス可能 |
アクセス修飾子を省略した場合はpublic
になります。
アクセス修飾子は、フィールド、コンストラクタ、メソッドに宣言することができます。
public
#
public
アクセス修飾子はどこからもアクセス可能です。
typescript
class Animal {public name: string; // フィールドにpublicアクセス修飾子// コンストラクターにpublicアクセス修飾子public constructor(theName: string) {this.name = theName;}// メソッドにpublicアクセス修飾子public move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);// publicアクセス修飾子である`this.name`を使用することが可能}}
typescript
class Animal {public name: string; // フィールドにpublicアクセス修飾子// コンストラクターにpublicアクセス修飾子public constructor(theName: string) {this.name = theName;}// メソッドにpublicアクセス修飾子public move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);// publicアクセス修飾子である`this.name`を使用することが可能}}
gorilla
を実装し、動作を確認してみます。
typescript
const gorilla = new Animal("ゴリラ");gorilla.move(10);//=> 'ゴリラ moved 10m.'gorilla.name = "ゴリラゴリラ";gorilla.move(20);//=> 'ゴリラゴリラ moved 20m.'
typescript
const gorilla = new Animal("ゴリラ");gorilla.move(10);//=> 'ゴリラ moved 10m.'gorilla.name = "ゴリラゴリラ";gorilla.move(20);//=> 'ゴリラゴリラ moved 20m.'
name
プロパティはpublic
宣言されているため、インスタンスされた変数(gorilla
)からの読み書きが可能になっています。「ゴリラ」から「ゴリラゴリラ」に変更することができます。
protected
#
protected
アクセス修飾子は自身のクラスとサブクラスからアクセス可能です。
Animal
クラスmove
メソッドのアクセス修飾子をpublic
からprotected
に変更しエラーを出してみます。
typescript
class Animal {public name: string;public constructor(theName: string) {this.name = theName;}// `public`から`protected`に変更protected move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);}}const gorilla = new Animal("ゴリラ");gorilla.move(10); // error TS2339: Property 'move' does not exist on type 'Animal'.
typescript
class Animal {public name: string;public constructor(theName: string) {this.name = theName;}// `public`から`protected`に変更protected move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);}}const gorilla = new Animal("ゴリラ");gorilla.move(10); // error TS2339: Property 'move' does not exist on type 'Animal'.
gorilla.move()
メソッドはprotected
宣言されているため、自身のクラスとサブクラスのみアクセスとなります。つまりインスタンスされたgorilla
からはアクセスが拒否され、コンパイルエラーが発生します。
protected
で保護されたmove()
メソッドを新たに実装し、10倍速く動くゴリラを作ってみます。
typescript
class Animal {public name: string;public constructor(theName: string) {this.name = theName;}// `public`から`protected`に変更protected move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);}}class Gorilla extends Animal {move(distanceInMeters: number) {super.move(distanceInMeters * 10);}}const gorilla = new Gorilla("速いゴリラ");gorilla.move(10);//=> '速いゴリラ moved 100m.'
typescript
class Animal {public name: string;public constructor(theName: string) {this.name = theName;}// `public`から`protected`に変更protected move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);}}class Gorilla extends Animal {move(distanceInMeters: number) {super.move(distanceInMeters * 10);}}const gorilla = new Gorilla("速いゴリラ");gorilla.move(10);//=> '速いゴリラ moved 100m.'
Animal
スーパークラスを持つGorilla
クラスを定義しmove()
を実装しています。Gorilla
クラスのmove()
メソッド内でsuper
キーワードを利用してスーパークラスのmove()
メソッドを呼び出しています。
private
#
private
アクセス修飾子は自身のクラスのみアクセス可能です。
protected move()
をprivate move()
に変更してみます。private
に変更されたことによりGorilla
クラスのsuper.move
にアクセスすることが許されずエラーとなります。
typescript
class Animal {public name: string;public constructor(theName: string) {this.name = theName;}// `public`から`private`に変更private move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);}}class Gorilla extends Animal {move(distanceInMeters: number) {super.move(distanceInMeters * 10); // Property 'move' is private and only accessible within class 'Animal'.}}
typescript
class Animal {public name: string;public constructor(theName: string) {this.name = theName;}// `public`から`private`に変更private move(distanceInMeters: number) {console.log(`${this.name} moved ${distanceInMeters}m.`);}}class Gorilla extends Animal {move(distanceInMeters: number) {super.move(distanceInMeters * 10); // Property 'move' is private and only accessible within class 'Animal'.}}
private
メソッドの多くの使い方としては、自身のクラス内の長いコードを機能別に分ける時に利用します。