JavaScriptのプライベートフィールドとプライベートメソッド
このページでは、JavaScriptにおけるプライベートフィールドおよびプライベートメソッドについて、基礎から応用までを具体例を交えながら解説します。
プライベートフィールドとは
プライベートフィールドは、クラス内で定義される特別なプロパティであり、外部やサブクラスからアクセスできないものです。JavaScriptでは、プライベートフィールドを定義する際に、プロパティ名の前に#を付けます。
例えば、次のようにプライベートフィールドを使います。
class Person {
// プライベートフィールドの定義
#name;
constructor(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
const person = new Person("Alice");
console.log(person.getName()); // "Alice"
console.log(person.#name); // エラー: プライベートフィールドにアクセスできません
プライベートフィールドの特徴
プライベートフィールドには以下の特徴があります。
- クラス外部からアクセス不可:プライベートフィールドは、インスタンスの外部から直接アクセスできません。
- サブクラスからもアクセス不可:プライベートフィールドは継承したクラス内でもアクセスできません。
- 静的なプライベートフィールド:プライベートフィールドはstaticキーワードと組み合わせて使用できます。
静的なプライベートフィールドの例は以下の通りです。
class Counter {
static #count = 0;
static increment() {
Counter.#count++;
}
static getCount() {
return Counter.#count;
}
}
Counter.increment();
console.log(Counter.getCount()); // 1
console.log(Counter.#count); // エラー: プライベートフィールドにアクセスできません
プライベートメソッドとは
プライベートメソッドは、クラス内でのみ使用できるメソッドです。プライベートフィールドと同様に、名前の前に#を付けて定義します。
例として、内部ロジックを隠すためのプライベートメソッドを見てみましょう。
class Calculator {
#add(a, b) {
return a + b;
}
calculateSum(a, b) {
return this.#add(a, b);
}
}
const calc = new Calculator();
console.log(calc.calculateSum(2, 3)); // 5
console.log(calc.#add(2, 3)); // エラー: プライベートメソッドにアクセスできません
プライベートメソッドの特徴
プライベートメソッドには以下の特徴があります。
- 外部からアクセス不可:プライベートメソッドは、インスタンスやクラスの外部から直接呼び出すことができません。
- サブクラスからもアクセス不可:プライベートメソッドは継承されたクラス内でも使用できません。
- プライベートフィールドと組み合わせ可能:プライベートメソッド内でプライベートフィールドを操作できます。
数学的な解釈と対応
プライベートフィールドやプライベートメソッドを数学的な視点で考えると、これらは関数や変数の作用域 (スコープ)を限定する仕組みとして捉えられます。
例えば、次のような関数 \\( f(x) = x^2 \\) において、内部的に補助関数 \\( g(x) = x \\) を利用する場合を考えます。
class MathFunction {
#square(x) {
return x * x;
}
calculateSquare(x) {
return this.#square(x);
}
}
const mathFunc = new MathFunction();
console.log(mathFunc.calculateSquare(4)); // 16
console.log(mathFunc.#square(4)); // エラー: プライベートメソッドにアクセスできません
ここで \\( g(x) \\) は内部的な計算に使用されますが、外部からは直接アクセスできません。
使用例と応用
プライベートフィールドやプライベートメソッドは、以下のような場面で役立ちます。
- カプセル化:内部状態を隠蔽し、インターフェースを簡潔に保つ。
- ロジックの保護:外部からの不正な操作を防ぎ、安全性を高める。
- 設計の明確化:クラスの内部ロジックを明確に分離する。
例えば、銀行口座の管理システムでは、内部的な計算ロジックを隠すことが重要です。
class BankAccount {
#balance = 0;
#updateBalance(amount) {
this.#balance += amount;
}
deposit(amount) {
this.#updateBalance(amount);
}
getBalance() {
return this.#balance;
}
}
const account = new BankAccount();
account.deposit(1000);
console.log(account.getBalance()); // 1000
console.log(account.#updateBalance(500)); // エラー: プライベートメソッドにアクセスできません
まとめ
JavaScriptのプライベートフィールドとプライベートメソッドは、クラスの設計をより堅牢にし、可読性や安全性を向上させる重要な機能です。適切に使用することで、コードの品質を大幅に向上させることができます。
このページで紹介した例を参考に、自身のプロジェクトでぜひ活用してみてください。