newの概要
| インスタンス生成 JavaScript予約語 | ||
|
new 概要 わかりやすく説明 |
||
|
newの基本的な使い方
以下は、newを使用した基本的な例です。
// クラスでのnewの使用例
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`こんにちは、${this.name} (${this.age}歳) です!`);
}
}
const person = new Person("Alice", 25); // インスタンス生成
person.greet(); // こんにちは、Alice (25歳) です!
// コンストラクタ関数でのnewの使用例
function Animal(type) {
this.type = type;
}
Animal.prototype.describe = function () {
console.log(`これは${this.type}です。`);
};
const dog = new Animal("犬");
dog.describe(); // これは犬です。
- クラスやコンストラクタ関数の設計に基づいて、新しいオブジェクトを生成します。
- 生成されたオブジェクトはそのクラスまたは関数のプロトタイプチェーンを継承します。
- コンストラクタ内で
thisは新しいオブジェクトを指します。
newの応用例
newを使用すると、複雑なオブジェクトや状態を管理するためのインスタンスを作成できます。
// クラスを用いた銀行口座管理
class BankAccount {
constructor(owner, initialBalance) {
this.owner = owner;
this.balance = initialBalance;
}
deposit(amount) {
if (amount > 0) {
this.balance += amount;
console.log(`入金: ${amount}円, 現在の残高: ${this.balance}円`);
}
}
withdraw(amount) {
if (amount > 0 && amount <= this.balance) {
this.balance -= amount;
console.log(`出金: ${amount}円, 現在の残高: ${this.balance}円`);
} else {
console.log("残高不足です。");
}
}
}
const account = new BankAccount("Bob", 1000);
account.deposit(500); // 入金: 500円, 現在の残高: 1500円
account.withdraw(700); // 出金: 700円, 現在の残高: 800円
account.withdraw(900); // 残高不足です。
- クラスや関数を使って、複数のインスタンスを簡単に生成できます。
- 各インスタンスは独立した状態を持ちながら、共通のメソッドを共有できます。
注意点
- 忘れがちな
new:newを付けずにコンストラクタ関数を呼び出すと、thisがグローバルオブジェクトやundefinedを指す可能性があります。 - クラスの使い方:
newを使わずにクラスを呼び出すとエラーになります(TypeError: Class constructor cannot be invoked without 'new')。 - オーバーロードはサポートされない: JavaScriptではコンストラクタのオーバーロードはサポートされません。代わりにデフォルト引数や条件分岐を使用します。
よくある質問
- Q:
newを忘れてコンストラクタを呼び出したらどうなりますか? - A:
newを忘れると、thisがundefined(strictモード)またはグローバルオブジェクト(非strictモード)を指します。意図しない動作を避けるため、常にnewを付けるようにしましょう。 - Q:
newが実際に行う処理は何ですか? - A:
newは以下の手順を実行します:- 新しい空オブジェクトを作成します。
- そのオブジェクトの
[[Prototype]]をコンストラクタのprototypeプロパティに設定します。 - コンストラクタ関数を呼び出し、その
thisを新しいオブジェクトにバインドします。 - 関数が明示的にオブジェクトを返さない場合、新しいオブジェクトを返します。
- Q:
newを使わずにオブジェクトを作る方法はありますか? - A: はい、
Object.create()やリテラル表記({})を使うことでオブジェクトを作成できます。ただし、クラスやコンストラクタ関数を使用する場合はnewが必要です。
まとめ
new演算子は、クラスやコンストラクタ関数から新しいインスタンスを生成するための基本的な仕組みです。
- 新しいオブジェクトを生成し、プロトタイプチェーンを適切に設定します。
- インスタンス化の際に必要な初期化処理を行います。
- 忘れがちな
newに注意し、正しくインスタンスを生成することが重要です。