概要
JavaScriptにおける
Object
は、すべてのオブジェクトの親的存在であり、
オブジェクトの生成・管理・継承の基盤を提供します。
特にコンストラクタ関数
、new
、this
を理解することで、
JavaScriptの「オブジェクト指向的な仕組み」が見えてきます。
つまり、
- コンストラクタ関数 … オブジェクトの設計図
- new演算子 … 設計図から新しいオブジェクトを生成
- this … 生成されたオブジェクト自身を参照
これらを理解すると、Object.assign
, Object.create
, Object.freeze
などの
Objectメソッドを効果的に使いこなせるようになります。
目次
コンストラクタ関数とは
コンストラクタ関数は、オブジェクトを生成するための設計図です。
関数名は慣習的に 大文字で始めます。
function User(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
console.log(`Hello, I'm ${this.name} (${this.age})`);
};
}
上記では、this
に name
と age
プロパティを設定しています。
しかし、ここではまだ User
関数を「設計」しただけで、
実際のオブジェクトはまだ存在していません。
newによるインスタンス生成
new
演算子を使うことで、設計図(コンストラクタ関数)からオブジェクトを生成できます。
const alice = new User("Alice", 25);
alice.greet(); // Hello, I'm Alice (25)
new
の内部では以下の4ステップが行われます:
- 新しい空のオブジェクト
{}
を生成 - そのオブジェクトを
this
に割り当てる - コンストラクタ関数を実行して
this
にプロパティを設定 - そのオブジェクトを自動的に返す
thisの役割と参照先
this
は、関数が「どの文脈で呼ばれたか」によって参照先が変わる特別なキーワードです。
コンストラクタ関数内では、常に「生成されたインスタンス自身」を指します。
function Car(model) {
this.model = model;
this.start = function() {
console.log(`${this.model} started!`);
};
}
const car1 = new Car("Toyota");
car1.start(); // Toyota started!
this.model
は car1.model
を参照します。
つまり、this
は new
で作られたオブジェクトそのものを指しているのです。
Objectメソッドと組み合わせる応用例
コンストラクタ・new・thisの理解を基礎として、
Object
の静的メソッドを活用すれば、柔軟なオブジェクト管理が可能です。
Object.assign と this
複数の設定をインスタンスにまとめて適用する例です。
function Config(options) {
Object.assign(this, { theme: "light", lang: "en" }, options);
}
const userConfig = new Config({ lang: "ja" });
console.log(userConfig); // { theme: "light", lang: "ja" }
-
Object.assign(this, defaultSettings, options)
によって、
デフォルトとユーザー設定をまとめて統合します。 - 同じキーは後から来たオブジェクト(
options
)で上書きされます。
Object.freeze とコンストラクタ
インスタンスの内容を変更不可にしたい場合に使います。
function Account(name, balance) {
this.name = name;
this.balance = balance;
Object.freeze(this);
}
const acc = new Account("Alice", 1000);
acc.balance = 2000; // 無視される
console.log(acc.balance); // 1000
-
Object.freeze(this)
により、
作成後のインスタンスを「凍結」してセキュアに保護できます。
Object.create とプロトタイプ継承
Object.create
は、既存オブジェクトを継承する新しいオブジェクトを作るメソッドです。
new
を使わないオブジェクト生成方法としても知られています。
const animal = {
speak() {
console.log(`${this.name} makes a sound.`);
}
};
const dog = Object.create(animal);
dog.name = "Dog";
dog.speak(); // Dog makes a sound.
-
Object.create(proto)
はproto
を継承したオブジェクトを返す。 - コンストラクタを使わず、軽量な継承を実現可能。
まとめ
概念 | 機能 | 使い方のポイント |
---|---|---|
コンストラクタ関数 | オブジェクトの設計図 | 関数名は大文字で開始する |
new演算子 | インスタンス生成 | thisに新しいオブジェクトを割り当てる |
this | 呼び出し元のオブジェクト参照 | コンストラクタでは生成されたオブジェクトを指す |
Object.assign | プロパティの統合 | 複数設定のマージに便利 |
Object.freeze | オブジェクトの凍結 | データの変更防止 |
Object.create | プロトタイプ継承 | 軽量な継承パターンを実現 |