🤯 序文:クラスなのに「実体」がいらない機能?
前回、継承を使って効率的に新しいクラスを作る方法を学びました。これであなたのクラス設計スキルはプロ級です。しかし、ここで一つの疑問が浮かびます。
「特定のインスタンスに依存しない機能は、どこに書くべきか?」
例えば、Userクラスがあったとして、「ユーザー全員の総数を数える機能」や、「メールアドレスが正しい形式かチェックする機能」は、aliceさんやbobさんといった個々のインスタンスが持つべき機能でしょうか?違いますね。これらはクラス全体が持つべき機能です。
JavaScriptでは、このような「インスタンス(実体)を作る必要がない、クラス直属の機能」を実装するために**静的(Static)**なメンバーを使います。これが、コードの設計を極限まで洗練させるための隠し技です!
1. ⚙️ 静的メソッド(Static Methods):クラス直属の「道具」
静的メソッドは、その名前の通り、**static**キーワードを付けて定義されます。
- 特徴: クラスを
newキーワードでインスタンス化することなく、クラス名に直接ドット(.)を付けて呼び出すことができます。 - 用途: 共通のユーティリティ関数や、インスタンスを作成するためのヘルパー関数など、個々のインスタンスの状態に依存しない処理に使われます。
📝 静的メソッドの定義と使い方
JavaScript
class Validator {
// staticキーワードを付けて定義
static isValidEmail(email) {
// メールアドレス形式のチェック処理(簡略化)
return email.includes('@') && email.includes('.');
}
static isValidPassword(password) {
return password.length >= 8;
}
}
// 呼び出し方:インスタンス化は不要!
const emailResult = Validator.isValidEmail("test@example.com");
console.log("Eメールは有効ですか?:", emailResult); // 結果: Eメールは有効ですか?: true
// ❌ 誤った使い方: インスタンスからは呼び出せない
// const checker = new Validator();
// checker.isValidEmail("a"); // ← エラーになる
Validator.isValidEmail()のように、クラス名に直接ドットを付けて呼び出すのが静的メソッドの最大の特徴です。
2. 🔢 静的プロパティ(Static Properties):クラス共通の「データ」
静的プロパティは、クラス全体で共有されるデータ(定数やカウンターなど)を格納するために使われます。これもstaticキーワードを付けて定義します。
📝 静的プロパティの定義と使い方
静的プロパティは、すべてのインスタンスで共通の値を保持します。
JavaScript
class User {
// 静的プロパティの定義 (クラス共通のデータ)
static userCount = 0;
static MAX_USERS = 100;
constructor(name) {
this.name = name;
// ユーザーが作成されるたびに、クラス共通のカウンターを増やす
User.userCount++;
}
static getCurrentUserCount() {
return User.userCount;
}
}
// ユーザーを作成する
const alice = new User("Alice");
const bob = new User("Bob");
// 呼び出し方:クラス全体でデータが共有されている
console.log("現在のユーザー総数:", User.getCurrentUserCount()); // 結果: 2
console.log("最大ユーザー数:", User.MAX_USERS); // 結果: 100
この例のように、User.userCountはaliceでもbobでもなく、Userクラス全体に紐づいているため、インスタンスがいくつ作られても共通のカウンターとして機能します。
3. 🧠 静的メソッドとインスタンスメソッドの使い分け
クラス設計において、どのメソッドをstaticにするか(静的メソッド)と、そうでないか(インスタンスメソッド)の判断は非常に重要です。
| メソッドの種類 | 特徴 | 呼び出し方 | 例 |
| インスタンスメソッド | 個々のデータ(this)を使う必要がある。 | alice.login() | alice個人のログイン処理 |
| 静的メソッド | 個々のデータを使わない。クラス共通の処理。 | User.isValidEmail() | どのユーザーにも共通のメールチェック処理 |
Google スプレッドシートにエクスポート
ルール: メソッド内で**this**(個々のインスタンスのデータ)を使わないなら、それは静的メソッドとして定義すべきです。
🌟 まとめ:staticでクラス設計を芸術に!
静的メンバーは、あなたのクラス設計を次のレベルに引き上げるための強力なツールです。
staticキーワード:クラス直属のメンバーであることを示す。- 静的メソッド:インスタンス化せずに、
ClassName.method()で呼び出す共通関数。 - 静的プロパティ:
ClassName.propertyでアクセスする、クラス全体で共有されるデータ。
このstaticの概念を使いこなせば、あなたのコードは機能ごとに美しく分離され、誰が見ても分かりやすい、**「究極に洗練された設計」**を持つようになるでしょう!これで、オブジェクト指向プログラミングの基礎と応用は完璧です。

