Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ ゲッターとセッターによるプロパティの管理 | JavaScriptクラスと継承の習得
JavaScriptロジックとインタラクション

bookゲッターとセッターによるプロパティの管理

メニューを表示するにはスワイプしてください

ゲッターとセッターは、JavaScriptにおいてオブジェクトのプロパティへのアクセスを制御する強力な方法。

ゲッターとセッターとは

JavaScriptでは、ゲッターセッターはオブジェクトのプロパティへのアクセスを制御するための特別なメソッド。プロパティの取得や変更方法を柔軟に定義でき、オブジェクトの内部状態を保護。

  • ゲッター:プロパティの値を取得するためのメソッド;
  • セッター:プロパティの値を設定または更新するためのメソッド。

銀行の金庫をイメージ。金庫は貴重品(プライベートプロパティ)を保管し、銀行員(ゲッター/セッター)が管理者の役割。直接金庫にアクセスできず、銀行員がルールやバリデーションに基づいてアイテムの取得や更新を行う。

ゲッターとセッターの定義と利用方法

ゲッターとセッターは、クラス内で get および set キーワードを使って定義。プロパティへアクセスすると自動的にゲッターが呼び出され、プロパティを変更するとセッターが直接プロパティを変更する代わりに呼び出される。

12345678910111213141516171819202122232425262728293031323334
class Animal { #type; // Private field constructor(name, type) { this.name = name; this.#type = type; // Assigning the private field } // Getter for the type property get type() { return this.#type; } // Setter for the type property set type(newType) { if (newType) { this.#type = newType; } else { console.log('Invalid type'); } } } const lion = new Animal('Lion', 'Wild'); // Using getter to access the private type console.log(lion.type); // Output: Wild // Using setter to modify the private type lion.type = 'Domestic'; console.log(lion.type); // Output: Domestic // Trying to set an invalid value lion.type = ''; // Output: Invalid type
copy

この例では、#typeはプライベートプロパティであり、値を取得するためのゲッター(get type())と、値を変更するためのセッター(set type(newType))を定義しています。セッターにはバリデーションが含まれており、無効な値の設定を防ぎます。これにより、プライベートデータの更新を制御できることが示されています。

ゲッターとセッターの利点

制御されたアクセス

  • ゲッターはプロパティの値へのアクセス方法を定義し、値を返す前に処理や操作を行うことが可能;
  • セッターはプロパティの更新方法を制御し、プライベートフィールドに代入する前にデータの検証や変換を行うことが可能。

データ保護

  • ゲッターとセッターを使用することで、オブジェクトの内部状態を保護し、制御されたインターフェースを通じてのみ操作を許可;
  • プライベートプロパティを隠したまま、必要な情報だけを外部コードに公開可能。

柔軟性

ゲッターとセッターを利用することで、外部コードとのインターフェースを変更せずに、プロパティのアクセスや変更時にバリデーションやログ記録などの追加ロジックを組み込むことが可能。

例:パスワード検証付きユーザーアカウント

パスワードが特定のセキュリティ基準を満たす必要があるユーザーアカウントを管理する場面を想定。セッターを使ってパスワードの強度を強制し、ゲッターで表示用にマスクされたパスワードを取得することが可能。

12345678910111213141516171819202122232425262728293031323334
class UserAccount { #password; // Private field constructor(username, password) { this.username = username; this.#password = password; } // Getter for password (returning a masked version) get password() { return '*'.repeat(this.#password.length); // Mask the password when retrieved } // Setter for password with validation set password(newPassword) { if (newPassword.length >= 8) { this.#password = newPassword; } else { console.log('Password must be at least 8 characters long'); } } } const user = new UserAccount('nick_feather', 'secret123'); // Accessing the password using the getter (masked) console.log(user.password); // Output: ********* // Setting a new valid password using the setter user.password = 'strongPassword123'; console.log(user.password); // Output: *************** // Trying to set an invalid password user.password = '123'; // Output: Password must be at least 8 characters long
copy

この例では、getterはパスワードの実際の値を隠すためにマスクされたバージョンを返し、setterはパスワードの検証を行い、パスワードが8文字以上であることを保証します。

ゲッターとセッターを使ったバリデーションロジックの例

ここでは、人物の年齢を管理し、その値が妥当な範囲内に収まるようにする別の例を紹介します。

12345678910111213141516171819202122232425262728293031323334
class Person { #age; // Private field constructor(name, age) { this.name = name; this.#age = age; } // Getter for age get age() { return this.#age; } // Setter for age with validation set age(newAge) { if (newAge > 0 && newAge < 120) { this.#age = newAge; } else { console.log('Invalid age'); } } } const peter = new Person('Peter', 30); // Accessing the age using the getter console.log(peter.age); // Output: 30 // Setting a new valid age using the setter peter.age = 35; console.log(peter.age); // Output: 35 // Trying to set an invalid age peter.age = 150; // Output: Invalid age
copy

この例は、セッターが年齢を有効な範囲内に保ち、不正なデータが保存されるのを防ぐ方法を示しています。

1. ゲッターを使用する主な目的は何ですか?

2. 次のコードで、console.log(user.password); の出力は何ですか?

question mark

ゲッターを使用する主な目的は何ですか?

正しい答えを選んでください

question mark

次のコードで、console.log(user.password); の出力は何ですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  9

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  9
some-alt