JavaScript におけるプロトタイプ継承(Prototypal Inheritance)—— 第 1 部
JavaScript はオブジェクト指向プログラミング(OOP)をサポートする言語ですが、クラスベースの言語(Java や C++ など)とは異なり、JavaScript は プロトタイプベースの継承(Prototypal Inheritance) を採用しています。この特性により、オブジェクトは他のオブジェクトを直接継承し、動的にプロパティやメソッドを追加・変更 することができます。
本記事では、JavaScript におけるプロトタイプ継承の基本概念を詳しく解説し、実践的なコード例を通じてその仕組みを理解します。
1. プロトタイプとは何か?
オブジェクトの基本構造
JavaScript のオブジェクトは、プロパティ(変数)とメソッド(関数)を持つデータ構造です。例えば、次のようなオブジェクト person を考えてみましょう。
javascriptlet person = {
name: "太郎",
age: 30,
greet: function() {
console.log("こんにちは!私は " + this.name + " です。");
}
};
この person オブジェクトには name、age の 2 つのプロパティと greet メソッドが含まれています。
プロトタイプチェーン
JavaScript では、すべてのオブジェクトは もう一つのオブジェクトを継承することが可能 です。この継承元となるオブジェクトを プロトタイプ(prototype) と呼びます。
例えば、上記の person オブジェクトは、JavaScript の組み込みオブジェクト Object を基に作られています。そのため、person は Object のプロパティやメソッドを使用できます。
javascriptconsole.log(person.toString()); // [object Object]
person 自体には toString() メソッドは定義されていませんが、これは Object.prototype から継承されているため、使用できます。
このように、JavaScript のオブジェクトは 親オブジェクトのプロパティやメソッドを継承する仕組み を持ち、これを プロトタイプチェーン(Prototype Chain) と呼びます。
2. __proto__ プロパティと Object.getPrototypeOf()
JavaScript では、オブジェクトのプロトタイプを確認する方法として、以下の 2 つの方法があります。
-
__proto__プロパティ(非推奨だが、一般的に使われる) -
Object.getPrototypeOf()メソッド(推奨される)
__proto__ を使う方法
javascriptconsole.log(person.__proto__); // [Object: null prototype] {}
このように、person オブジェクトの __proto__ は Object.prototype を指していることが分かります。
Object.getPrototypeOf() を使う方法
javascriptconsole.log(Object.getPrototypeOf(person)); // [Object: null prototype] {}
Object.getPrototypeOf(person) も Object.prototype を指しており、__proto__ と同じ情報を取得できます。
3. プロトタイプを使ったオブジェクトの継承
プロトタイプ継承を使うことで、あるオブジェクトを 別のオブジェクトの雛形として利用 し、新しいオブジェクトを
