JavaScript/プロトタイプベース
JavaScriptはプロトタイプベースのオブジェクト指向言語です。 この場合はプロトタイプは「雛形」です。 目的の機能を持ったのオブジェクトの生成を、既に存在する雛形を複製することで実現する戦略といえます。 この雛形の事をプロトタイプと呼びます。 JavaScript以外のプロトタイプベースのオブジェクト指向言語としては Lua があげられます。 Lua は MediaWiki のモジュールの記述言語にも採用されています。
最初のプロトタイプベースのオブジェクト指向言語は、Selfです。 Selfは、Smalltalkを開発したチームの一員がさらに記述性が高く簡素なオブジェクト指向言語の研究から誕生しました。 JavaScriptもSelfの影響を直接的に受けています。
プロトタイプに基づくプロトタイプベースに対し、クラスに基づいたオブジェクトシステムを採用したオブジェクト指向言語をクラスベースと呼びます(Smalltalk, C++, Java など)。 JavaScript ではECMACScript 2015/ES6でclass構文が導入されましたが、クラスベース風の構文を加えたに過ぎず依然JavaScriptはプロトタイプベースのオブジェクト指向言語です。
デザインパターンの用語を使えば
- プロトタイプベース -- Prototype パターン
- クラスベース -- Factory Method パターン
と捉えることができます。
プロトタイプの継承モデル
編集この節は書きかけです。この節を編集してくれる方を心からお待ちしています。
プロパティの継承
編集prototypeオブジェクトの共有と派生
プロトタイプチェーン
編集有向グラフ 木構造 figure
メソッドの模倣
編集クラスベースで言うメソッドをプロトタイプベースが模倣しているという立場も取れます(JavaScriptのメソッドは全て仮想メソッド)。 逆にクラスベースのVTableは限定的な prototype とも。 アプローチは違っても言語機構のインフラストラクチャーは似通ってきている。
- 大きな違い:プロトタイプベースでは、どのオブジェクトもプロトタイプになりうる。
オブジェクトの作成方法の構文的側面
編集この節は書きかけです。この節を編集してくれる方を心からお待ちしています。 new 演算子の正体
コンストラクタ
編集伝統的な関数を使ったコンストラクタ
クラス・コンストラクタ
編集class構文による --
Object.create
編集ECMAScript 5 の Object.create
プロパティディスクリプタ
編集この節は書きかけです。この節を編集してくれる方を心からお待ちしています。
::標準組み込みオブジェクトのプロトタイプを書き換えるのは良くない/のコラムはここに移動か?