prototype(プロトタイプ)について

2017年1月28日

オブジェクトにはprototypeというプロパティが存在します。prototypeプロパティにはオブジェクトが格納されており、このオブジェクトに対してプロパティとメソッドを追加することが可能です。

 

スポンサーリンク

 

 

オブジェクトリテラルによって生成された全てのオブジェクトは、Object.prototype.〜のように記述してprototypeを参照することが可能です。

 

関連ページ

オブジェクトについて[オブジェクトリテラル][プロパティ][メソッド]

 

またオブジェクトである関数にももちろんprototypeプロパティは存在します。そのprototypeは、コンストラクタ関数としてオブジェクトインスタンスを生成した際に利用することができます。逆に言えば、オブジェクトインスタンスのprototypeは、常に自身を作ったコンストラクタ関数のprototypeを参照しにいきます。

 

関連ページ

オブジェクトについて[コンストラクタ関数][new演算子]

 

 

まずはprototypeを利用していない例を見てみます。

 

例1

 

上記では、まずBookコンストラクタ関数を作成し、new演算子によって、book1/book2オブジェクトを生成しています。

 

次にprototypeプロパティを利用して、メソッドを宣言してみます。

 

例2

 

例1と違って、6行目において、メソッドをprototypeで宣言しています。例1では、インスタンスとしてbook1/book2オブジェクトが生成されると、生成されたそれぞれのオブジェクトに対してgetInfoメソッドも格納されていきます。つまり、オブジェクトインスタンスが増えた分だけgetInfoメソッド分のメモリが増えていきます。

 

しかし、例2では各book1/book2オブジェクトは元となるコンストラクタ関数の共通のprototypeを参照しにいきます。つまり例1と違って余計なメモリを消費していません。

 

prototype

 

 

このような理由から基本的にオブジェクトのメソッドはprototypeで宣言します

 

また上記で説明したような、コンストラクタ関数から生成されたオブジェクトインスタンスのprototypeは、Object.prototypeから継承されています。以下例で説明します。

 

 

6行目でObject.prototypeに対してgetInfoを宣言しています。Bookコンストラクタ関数自体およびBook.prototypeのどちらにおいてもgetInfoは宣言されていませんが、11行目においてgetInfoを呼び出す際には、最終的にObject.prototypeが参照されます。

 

このようにして、prototypeプロパティによってオブジェクトが繋がっているような仕組みは、プロトタイプチェーンと呼ばれています。

 

ただし、Object.prototypeにユーザが追加したものは、基本的に全てのオブジェクトに影響を与えてしまいます。基本的に組み込みオブジェクト等のprototypeも含め、Object.prototypeには何も追加しないことが推奨されています。

 

関連ページ

Objectオブジェクトについて[組み込みオブジェクト]

 

クラス構文について[class][コンストラクタ][ES6]

 

複数のパーティクルを表現する[prototype][canvas]

 

 

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー