6.1 クラスのコンストラクター
コンストラクターとクラスのメソッドは、JavaScriptのオブジェクト指向プログラミングの基本要素だよ。 オブジェクトを作成して初期化したり、その振る舞いを定義したりすることができるんだ。以下では、 コンストラクターとクラスのメソッドの動作や使い方を見ていこう。
コンストラクターって何?
コンストラクターはクラスの特別なメソッドで、新しいクラスのインスタンスを作成するときに呼ばれるよ。 オブジェクトを初期化したり、そのプロパティに値を設定したり、他の初期タスクを実行するために使われるんだ。
コンストラクターの定義
コンストラクターはconstructor
キーワードを使って定義するよ。コンストラクター内部では
this
キーワードを使ってオブジェクトのプロパティやメソッドにアクセスできるんだ。
構文:
class ClassName {
constructor(パラメータ) {
// オブジェクトの初期化
}
}
例:
クラスPerson
では、constructor
メソッドが2つのパラメータname
とage
を受け取っている。
これらのパラメータは、作成されたオブジェクトのname
とage
プロパティを初期化するために使われるよ。
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const person1 = new Person('Alice', 30);
const person2 = new Person('Bob', 25);
console.log(person1.name); // 表示: Alice
console.log(person2.age); // 表示: 25
デフォルトコンストラクター
コンストラクターが明示的に定義されていない場合、JavaScriptは自動的に空のデフォルトコンストラクターを作成するよ。
例:
class Animal {}
const animal = new Animal();
console.log(animal); // 表示内容: Animalクラスの{}
4.2 クラスのメソッド
クラスのメソッドはクラスの本体内で定義され、そのクラスによって作成されたオブジェクトに対して機能を提供するよ。 メソッドは自動的にクラスのプロトタイプに追加されるから、クラスのすべてのインスタンスがそれを継承して使用できるんだ。
構文:
class ClassName {
constructor(パラメータ) {
// オブジェクトの初期化
}
メソッド1() {
// メソッドの本体
}
メソッド2() {
// メソッドの本体
}
}
例:
class Car {
constructor(brand, model) {
this.brand = brand;
this.model = model;
this.mileage = 0;
}
drive(distance) {
this.mileage += distance;
console.log(`${this.brand} ${this.model} drove ${distance} miles. Total mileage: ${this.mileage}`);
}
getDetails() {
return `${this.brand} ${this.model}, Mileage: ${this.mileage}`;
}
}
const myCar = new Car('Toyota', 'Camry');
myCar.drive(50); // "Toyota Camry drove 50 miles. Total mileage: 50"
console.log(myCar.getDetails()); // "Toyota Camry, Mileage: 50"
説明:
- クラス
Car
には2つのメソッドdrive()
とgetDetails()
が定義されている - メソッド
drive()
は車の走行距離を増やし、走行した距離に関する情報を表示する - メソッド
getDetails()
は車に関する情報を含む文字列を返す
6.3 プライベートメソッド
ECMAScriptの新しい仕様の導入により、クラスの外からアクセスできないプライベートメソッドやプロパティを作成することが可能になったよ。それには#記号を名前の一部として使うんだ。
プライベートメソッドとプロパティの例:
class BankAccount {
#balance = 0;
constructor(initialBalance) {
this.#balance = initialBalance;
}
#validateAmount(amount) {
if (amount <= 0) {
throw new Error('Amount must be positive.');
}
}
deposit(amount) {
this.#validateAmount(amount);
this.#balance += amount;
console.log(`Deposited ${amount}. New balance: ${this.#balance}`);
}
withdraw(amount) {
this.#validateAmount(amount);
if (amount > this.#balance) {
throw new Error('Insufficient funds.');
}
this.#balance -= amount;
console.log(`Withdrew ${amount}. New balance: ${this.#balance}`);
}
getBalance() {
return this.#balance;
}
}
const account = new BankAccount(100);
account.deposit(50); // 表示: Deposited 50. New balance: 150
account.withdraw(30); // 表示: Withdrew 30. New balance: 120
console.log(account.getBalance()); // 表示: 120
// プライベートメソッドやプロパティにアクセスしようとするとエラーになる
account.#balance; // SyntaxError
account.#validateAmount(50); // SyntaxError
GO TO FULL VERSION