uhyohyo.net

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

九章第四回 プロトタイプベース

プロトタイプベースとは

今まで解説してきたオブジェクト指向ですが、実はひとくちにオブジェクト指向といっても種類があります。JavaScriptは、その中でもプロトタイプベースという種類のものになっています。

では、プロトタイプベースとは何でしょう。プロトタイプとは、九章第二回で解説したprototypeのことです。

これは、コンストラクタのprototypeにプロパティ(やメソッド)をくっつけておくことで全てのインスタンスから利用することができ、オブジェクトを特徴付けるというものでした。

ここで、プロトタイプベースの特徴といえるのが、インスタンスも1つのオブジェクトであるので、自由にメソッドを変更・追加したり、プロパティも追加したりできます。

「インスタンスも1つのオブジェクトであるので」と書きましたが、どんなオブジェクトであろうと自由に操作できるというのがプロトタイプベース(インスタンスベースとも言います)の特徴なのです。

クラスベース

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

クラスベースでは、オブジェクトの型はクラスを作ることで表現されます。クラスでは、そのクラスのインスタンスが持つプロパティ・メソッドを全て決定してしまい、それ以外のプロパティやメソッドは持てないというものです。クラスベースのオブジェクト指向は型システムと相性が良いという特徴をもちます。また、JavaScript以外のプロトタイプベース言語としてはIoなどがあります。

継承

さて、継承は、prototypeを利用することで実現していました。つまり、prototypeの機能は型とインスタンスの関係を結びつけるもので、直接継承のための機能ではないので、JavaScriptの機能としては継承はないことになります。

対してクラスベースでは、基本的に言語の機能として継承があります。このように、言語機能として継承を用意しなくても継承を行えるのがプロトタイプベースの特徴の1つです。

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

ここで話がDOMに戻ります。実は、DOMの構造もオブジェクト指向的です。

例えば、全てのノードがappendChildなどのようなメソッドを持っています。これは、ノードが何かのコンストラクタであり、prototypeにappendChildがあるのであろうと想像がつきます。

ただ、DOMそのものは、構造を定義しているだけで、DOMそのものがプロトタイプベースというわけではありません。先の例に出したJavaもDOMを一応扱えます。

さて、ノードは、Nodeというオブジェクトのインスタンスです。

var body = document.body;
            console.log(body instanceof Node);
          

「true」となります。

console.log(Node.prototype.appendChild);

これは実はブラウザによって結果がわかれたのですが、Opera,Chromeなどはundefinedとならず、メソッドが存在するということがわかります。

console.log(Element.prototype instanceof Node)

これも同じく結果がわかれましたが、Opera,Chromeなどはtrueとなり、継承が前回紹介した方法で行われていることがわかります。

ちなみに、Elementは、ノードのうち、要素のことです。