概要: このチュートリアルでは、プライベートインスタンスメソッド、プライベートスタティックメソッド、プライベートゲッター/セッターを含む、JavaScript プライベートメソッドについて学習します。
JavaScript プライベートメソッド入門
デフォルトでは、クラスのメンバーはパブリックです。ES2020 では、プライベートフィールドとメソッドを含むプライベートメンバーが導入されました。
パブリックメソッドをプライベートにするには、その名前の前にハッシュ#
を付けます。JavaScript では、インスタンスメソッド、スタティックメソッド、ゲッター/セッターのプライベートメソッドを定義できます。
プライベートインスタンスメソッドの定義構文を次に示します。
class MyClass {
#privateMethod() {
//...
}
}
Code language: JavaScript (javascript)
この構文では、#privateMethod
はプライベートインスタンスメソッドです。これはMyClass
内でのみ呼び出すことができます。言い換えれば、クラスの外側またはMyClass
のサブクラスからは呼び出すことができません。
MyClass
内で#privateMethod
を呼び出すには、次のようにthis
キーワードを使用します。
this.#privateMethod();
Code language: JavaScript (javascript)
プライベートスタティックメソッドの定義構文を次に示します。
class MyClass {
static #privateStaticMethod() {
//...
}
}
Code language: JavaScript (javascript)
MyClass
内で#privateStaticMethod()
を呼び出すには、this
キーワードの代わりにクラス名を使用します。
MyClass.#privateStaticMethod();
Code language: JavaScript (javascript)
プライベートゲッター/セッターの構文を次に示します。
class MyClass {
#field;
get #myField() {
return #field;
}
set #myField(value){
#field = value;
}
}
Code language: JavaScript (javascript)
この例では、#myField
はプライベートフィールド#field
へのアクセスを提供するプライベートゲッターとセッターです。
実際には、プライベートメソッドを使用して、オブジェクトが公開するメソッドの数を最小限に抑えます。
経験則として、まずすべてのクラスメソッドをデフォルトでプライベートにする必要があります。そして、オブジェクトが他のオブジェクトと対話するためにそのメソッドを使用する必要がある場合にのみ、メソッドをパブリックにします。
JavaScript プライベートメソッドの例
プライベートメソッドの使用例をいくつか見てみましょう。
1) プライベートインスタンスメソッドの例
プライベートインスタンスメソッドを持つPerson
クラスの定義方法を次に示します。
class Person {
#firstName;
#lastName;
constructor(firstName, lastName) {
this.#firstName = firstName;
this.#lastName = lastName;
}
getFullName(format = true) {
return format ? this.#firstLast() : this.#lastFirst();
}
#firstLast() {
return `${this.#firstName} ${this.#lastName}`;
}
#lastFirst() {
return `${this.#lastName}, ${this.#firstName}`;
}
}
let person = new Person('John', 'Doe');
console.log(person.getFullName());
Code language: JavaScript (javascript)
出力
John Doe
Code language: JavaScript (javascript)
この例では
最初に、Person
クラス本体に2つのプライベートフィールド#firstName
と#lastName
を定義します。
次に、プライベートメソッド#firstLast()
と#lastFirst()
を定義します。これらのメソッドは、異なる形式でフルネームを返します。
3つ目に、人のフルネームを返すパブリックインスタンスメソッドgetFullName()
を定義します。getFullName()
メソッドは、プライベートメソッド#firstLast()
と#lastFirst()
を呼び出してフルネームを返します。
最後に、新しいperson
オブジェクトを作成し、フルネームをコンソールに出力します。
2) プライベートスタティックメソッドの例
次に、Person
クラスに#validate()
プライベートスタティックメソッドを追加します。
class Person {
#firstName;
#lastName;
constructor(firstName, lastName) {
this.#firstName = Person.#validate(firstName);
this.#lastName = Person.#validate(lastName);
}
getFullName(format = true) {
return format ? this.#firstLast() : this.#lastFirst();
}
static #validate(name) {
if (typeof name === 'string') {
let str = name.trim();
if (str.length >= 3) {
return str;
}
}
throw 'The name must be a string with at least 3 characters';
}
#firstLast() {
return `${this.#firstName} ${this.#lastName}`;
}
#lastFirst() {
return `${this.#lastName}, ${this.#firstName}`;
}
}
let person = new Person('John', 'Doe');
console.log(person.getFullName());
Code language: JavaScript (javascript)
動作方法。
最初に、文字列が3文字以上の場合に値を返すスタティックメソッド#validate()
を定義します。それ以外の場合は例外を発生させます。
次に、コンストラクタで#validate()
プライベートスタティックメソッドを呼び出して、対応するプライベート属性に割り当てる前にfirstName
とlastName
引数を検証します。
まとめ
- メソッド名に
#
をプレフィックスしてプライベートにします。 - プライベートメソッドはクラス内で呼び出すことができ、クラスの外側またはサブクラスからは呼び出すことができません。