uhyohyo.net

JavaScript初級者から中級者になろう

九章第四回 プロトタイプ指向

このページの最終更新日:

プロトタイプ指向とクラス指向

第1回でプロトタイプ指向クラス指向という2種類のオブジェクト指向的考え方に触れました。これらは必ずしもはっきりと区別できるものではありませんが、JavaScriptはプロトタイプ指向と考えられています。

プロトタイプ指向の特徴は、オブジェクトの「種類」のふるまいが別のオブジェクト(プロトタイプ)によって決められることです。というのも、JavaScriptにおいてはこれまで解説したように、prototypeによりある種類のオブジェクトが持つメソッド等を定義できました。プロトタイプ指向ではprototypeも結局のところただのオブジェクトなので、自由に操作できます。

このようなプロトタイプ指向の考え方を広めたプログラミング言語としてSelfという言語が有名です。ただ、それらに比べるとJavaScriptのプロトタイプ指向は少し後述のクラス指向に寄っているといえます。

一方、プロトタイプ指向と対立する概念としてクラス指向というものがあります。代表的なのはJavaなどです(JavaScriptとは別物なので注意しましょう)。

クラスベースでは、オブジェクトのふるまいはクラスを作ることで表現されます。クラスは、そのクラスのインスタンスが持つプロパティ・メソッドを定義します。基本的にクラスはオブジェクトとは異なるものであり、したがってクラスをオブジェクトのように操作することは困難です(ただし、Rubyのようにメタプログラミング機能が発達している言語ではその限りではありません。このような言語によりプロトタイプ指向とクラス指向の境界が曖昧になっています)。これがクラス指向がプロトタイプ指向と大きく異なる点です。

継承

前回紹介したように、JavaScriptでは継承はprototypeを利用することで実現していました。つまり、prototypeの仕組みを用いれば自然と継承が実現できるということです。

一方クラスベースでは、基本的に言語の機能として継承があり、言語レベルで特殊な扱いが必要になります。

DOMにみるオブジェクト指向

少しDOMの話もしましょう。実は、DOMの構造もオブジェクト指向的です。

例えば、全てのノードがappendChildなどのようなメソッドを持っています。これは、実はノードはNodeのインスタンスであり、したがってNode.prototypeにappendChildがあるのだろうと想像がつきます。

また、ノードには要素ノードやテキストノードなどの種類がありました。これらはそれぞれElementとTextのインスタンスであり、さらにこれらはNodeを継承しています。例えばconsole.log(Element.prototype instanceof Node);はtrueを表示するでしょう。