カテゴリ: JavaScript 更新日: 2026/06/09

JavaScriptのプロトタイプチェーン完全ガイド!初心者でもわかるオブジェクト指向の仕組み

JavaScriptのプロトタイプチェーンとは?仕組みと使い方
JavaScriptのプロトタイプチェーンとは?仕組みと使い方

先生と生徒の会話形式で理解しよう

生徒

「先生、JavaScriptでオブジェクトのプロパティを継承する仕組みって何ですか?」

先生

「それはプロトタイプチェーンと呼ばれる仕組みです。オブジェクトが持っていないプロパティを、他のオブジェクトから順番に探して使える機能です。」

生徒

「具体的にはどういうことですか?ちょっと難しそうです。」

先生

「では、簡単な例で見ていきましょう。実際にJavaScriptのコードで確認するのが一番わかりやすいです。」

1. プロトタイプチェーンとは?基本の考え方

1. プロトタイプチェーンとは?基本の考え方
1. プロトタイプチェーンとは?基本の考え方

JavaScriptのオブジェクトは、プロパティやメソッドを直接持つだけでなく、別のオブジェクトからもプロパティを参照できます。この参照のつながりを「プロトタイプチェーン」と呼びます。プロトタイプチェーンを使うと、複数のオブジェクト間で機能を共有できるため、コードの重複を減らせます。


const animal = {
  speak: function() {
    console.log("動物の声");
  }
};

const dog = {
  name: "ポチ"
};

dog.__proto__ = animal; // プロトタイプチェーンを設定
dog.speak(); // animalのspeakメソッドが呼ばれる

上の例では、dogオブジェクトには`speak`メソッドはありませんが、プロトタイプチェーンによってanimalオブジェクトの`speak`メソッドを使えます。

2. プロトタイプチェーンの仕組みを図で理解する

2. プロトタイプチェーンの仕組みを図で理解する
2. プロトタイプチェーンの仕組みを図で理解する

プロトタイプチェーンは、オブジェクトがプロパティを探すときに順番にたどるチェーンのことです。オブジェクト → プロトタイプ → そのプロトタイプのプロトタイプ、と順番に探していき、最終的には`Object.prototype`までたどり着きます。


console.log(dog.name); // "ポチ" 自分のプロパティを参照
console.log(dog.speak); // animalのプロパティを参照
console.log(dog.toString); // Object.prototypeのメソッドを参照

このように、自分のプロパティにない場合は自動で上位のオブジェクトを参照する仕組みです。

3. クラスとプロトタイプの関係

3. クラスとプロトタイプの関係
3. クラスとプロトタイプの関係

ES6以降のJavaScriptでは`class`構文を使えます。クラスで作ったオブジェクトも内部ではプロトタイプチェーンを利用しています。


class Animal {
  speak() {
    console.log("動物の声");
  }
}

const cat = new Animal();
cat.speak(); // "動物の声"
console.log(Object.getPrototypeOf(cat) === Animal.prototype); // true

このように、`cat`オブジェクトは`Animal.prototype`をプロトタイプとして持ち、そこからメソッドを呼び出します。

4. プロトタイプチェーンのメリットと使い方

4. プロトタイプチェーンのメリットと使い方
4. プロトタイプチェーンのメリットと使い方

プロトタイプチェーンの最大のメリットは、同じメソッドや機能を複数のオブジェクトで共有できることです。例えば、たくさんの動物オブジェクトに`speak`メソッドを一つずつ作る必要はありません。


function Bird(name) {
  this.name = name;
}
Bird.prototype.fly = function() {
  console.log(this.name + "が飛んでいます");
};

const sparrow = new Bird("スズメ");
sparrow.fly(); // "スズメが飛んでいます"

Birdオブジェクト全てが`fly`メソッドを共有できるので、効率的にメモリを使えます。

5. プロトタイプチェーンの注意点

5. プロトタイプチェーンの注意点
5. プロトタイプチェーンの注意点

プロトタイプチェーンを使うときには注意が必要です。例えば、上書きされたり循環したりすると予期しない動作になります。また、プロパティを検索する順番を理解していないと、思ったオブジェクトのプロパティが呼ばれないこともあります。


dog.__proto__ = dog; // これは循環になり危険
// dog.speak() を呼ぶと無限ループでエラーになる

こうしたリスクを避けるためには、`class`や`Object.create`を正しく使うことが重要です。

6. Object.createでプロトタイプを設定する方法

6. Object.createでプロトタイプを設定する方法
6. Object.createでプロトタイプを設定する方法

JavaScriptでは`Object.create`を使って、簡単にプロトタイプチェーンを作ることができます。


const parent = {
  greet: function() {
    console.log("こんにちは");
  }
};

const child = Object.create(parent);
child.greet(); // "こんにちは"

この方法だと、childオブジェクト自体にはプロパティを持たせず、parentオブジェクトのプロパティを利用できます。

7. 日常生活に例えると?

7. 日常生活に例えると?
7. 日常生活に例えると?

プロトタイプチェーンは、日常生活に例えると家族のルールや習慣の継承のようなものです。自分の家にはルールがなくても、親の家や祖父母の家のルールを順番にたどって生活することに似ています。


const grandParent = { rule: "早寝早起き" };
const parent = Object.create(grandParent);
const child = Object.create(parent);

console.log(child.rule); // "早寝早起き" 祖父のルールを参照

このように、順番に探すことでプロパティを共有できるのがプロトタイプチェーンの便利な点です。

8. プロトタイプチェーンを理解してオブジェクト指向を使いこなそう

8. プロトタイプチェーンを理解してオブジェクト指向を使いこなそう
8. プロトタイプチェーンを理解してオブジェクト指向を使いこなそう

プロトタイプチェーンを理解すると、JavaScriptのオブジェクト指向プログラミングをより深く理解できます。クラスやコンストラクタ関数を使ったオブジェクトの継承や、効率的なメソッド共有など、応用の幅が広がります。


class Vehicle {
  start() { console.log("エンジン始動"); }
}
class Car extends Vehicle {}
const myCar = new Car();
myCar.start(); // Vehicleのメソッドを利用

このように、クラス継承も内部ではプロトタイプチェーンで実現されています。

まとめ

まとめ
まとめ

ここまでJavaScriptのプロトタイプチェーンについて詳しく学んできました。プロトタイプチェーンは、オブジェクトが持たないプロパティやメソッドを親オブジェクトやその上位のオブジェクトから順番に参照して利用する仕組みであり、JavaScriptのオブジェクト指向の基盤となる重要な概念です。オブジェクトのプロパティ検索は、自分自身 → プロトタイプ → さらにそのプロトタイプという順序で行われ、最終的にObject.prototypeまで辿り着きます。これにより、同じメソッドを複数のオブジェクトで効率的に共有でき、コードの重複やメモリの無駄を減らすことができます。

また、ES6のclass構文やObject.createを使うことで、プロトタイプチェーンを直感的に設定でき、クラス継承やオブジェクトの共有メソッドを簡単に実装できます。プロトタイプチェーンの理解は、JavaScriptでオブジェクト指向を正しく活用するための必須スキルです。注意点として、プロトタイプチェーンの循環や意図しない上書きはエラーや無限ループの原因になるため、正しい設計と理解が不可欠です。

具体的な例として、次のように親オブジェクトのメソッドを子オブジェクトで利用することができます。

 const parent = { greet: function() { console.log("こんにちは"); } }; const child = Object.create(parent); child.greet(); // "こんにちは"
このようにchildオブジェクト自体にはプロパティを持たせずに親の機能を利用することが可能です。また、クラス継承を使う場合も、内部的には同じプロトタイプチェーンが動作しています。

日常生活に例えると、プロトタイプチェーンは家族の習慣やルールを引き継ぐ仕組みに似ています。自分の家のルールがなくても、親や祖父母の家のルールを順番に参照して生活することができるように、オブジェクトも必要なプロパティやメソッドを順番に探して利用することができます。

プロトタイプチェーンを理解することで、クラスやオブジェクトの継承、メソッドの効率的な共有、JavaScriptオブジェクト指向の深い理解につながります。これにより、コードの保守性向上や開発効率の改善が期待でき、より高度なJavaScriptプログラミングへの応用が可能となります。

先生と生徒の振り返り会話

生徒

「先生、プロトタイプチェーンを理解すると、オブジェクトのプロパティがどこから来るのかがわかるんですね。」

先生

「その通りです。プロパティやメソッドが自分のオブジェクトに無くても、順番に親オブジェクトを探して使えるのがプロトタイプチェーンの便利なところです。」

生徒

「Object.createやclassを使うと、簡単にチェーンを作れるんですね。」

先生

「そうです。Object.createは親オブジェクトを直接指定でき、classは内部的にプロトタイプチェーンを設定してくれます。これで継承やメソッドの共有がスムーズに行えます。」

生徒

「なるほど、循環させると危険という注意も必要ですね。」

先生

「その通りです。チェーンの順序や上書きに注意することで、安全に効率的なオブジェクト設計ができます。プロトタイプチェーンの理解は、JavaScriptで高度なオブジェクト指向を使いこなすための基礎になります。」

生徒

「わかりました。これで、オブジェクトの継承やメソッド共有を自信を持って使えそうです。」

先生

「その通りです。これからはプロトタイプチェーンを意識して設計することで、より効率的で保守性の高いJavaScriptコードを書けるようになります。」

カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptのスコープとは?ローカル変数・グローバル変数の違いと使い分け
New2
TypeScript
TypeScriptで型の合成時に発生する型エラーの対処法を徹底解説!初心者にもわかりやすく解説
New3
TypeScript
TypeScriptでAPI呼び出しをラップするユーティリティ関数の設計完全ガイド!初心者向けにAxiosやFetchの使い方を解説
New4
TypeScript
TypeScriptのMapped Typesとインターフェースの連携方法を徹底解説!初心者でも理解できる型変換の基本
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのループで無限ループが起きる原因と対策を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの文字列の長さを取得する(lengthプロパティ)
No.4
Java&Spring記事人気No4
TypeScript
TypeScriptのファイル分割とimport/exportの基本を徹底解説!初心者でも安心のやさしい入門
No.5
Java&Spring記事人気No5
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.6
Java&Spring記事人気No6
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptのプリミティブ型と参照型の違いを初心者向けに解説
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptでクエリパラメータを取得する方法を完全解説 URLSearchParamsの使い方を初心者向けに丁寧に説明