JavaScript プライベートメソッド

概要: このチュートリアルでは、プライベートインスタンスメソッド、プライベートスタティックメソッド、プライベートゲッター/セッターを含む、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 DoeCode 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()プライベートスタティックメソッドを呼び出して、対応するプライベート属性に割り当てる前にfirstNamelastName引数を検証します。

まとめ

  • メソッド名に#をプレフィックスしてプライベートにします。
  • プライベートメソッドはクラス内で呼び出すことができ、クラスの外側またはサブクラスからは呼び出すことができません。
このチュートリアルは役に立ちましたか?