« JavaScript を学ぶ上で読むべきウェブサイト | メイン | re: javascript vs perl - オブジェクトのメモリー効率 »

2006年10月19日

JavaScript は、なぜプロトタイプベースなのか

 決して専門ではないので、以下、間違っていたら指摘してください。

 JavaScript がプロトタイプベースであることに対する一番妥当な説明は、クラスベースのオブジェクト指向言語よりもプロトタイプベースの言語のほうが、ランタイムの構造が単純になり、かつ、メモリ使用量が小さくなるからでしょう。

 クラスベース OO のランタイムを作成しようと思うと、以下の各機能が必要になります。

1) クラス毎: メンバ関数を納めるハッシュテーブルと、親クラスを指すポインタ
2) インスタンス毎: プロパティを格納するハッシュテーブルと、クラスへのポインタ

また、インスタンスの生成にあたっては、(デフォルト値を含め) 全ての変数のエントリが作成されることになります。

 一方、プロトタイプベース OO のランタイムにおいては、クラスとインスタンスの区別はないので、 1 と 2 の両者を単一の構造で表現できます。また、インスタンス生成にあたって、デフォルト値を複製する必要もありません。これらの点により、ランタイムの構造が単純化され、メモリ使用量が低下するのです。

 しかし、純粋なプロトタイプベースの OO に対しては、メンテナンス性への懸念がつきまといます。インスタンスへの操作と型 (アーキタイプ) への操作の区別が、ソースコードからは読み取りにくいためです。

 この問題に対処するために、JavaScript ではプロトタイプをコンストラクタを経由して指定するようになっています。

Animal := { ... };
Penguin := { _Proto: Animal, fly: ... };
donpen := { _Proto: Penguin };
NewtonScript の例
function Animal() {
}
function Penguin() {
}
Penguin.prototype.fly = function () {
   ...
}
donpen = new Penguin;
JavaScript の例

 このように、型を通常のグローバルオブジェクトとせず、コンストラクタのプロトタイプ (constructor.prototype) という指定方法を採用することで、 JavaScript では、アーキタイプを操作している場合には、それとわかるようになっています。

 オブジェクトの生成も clone ではなく new ですし、JavaScript はクラスベースオブジェクト指向言語のシンタックスシュガーつきプロトタイプ指向言語なのだろうと、私は理解しています。JavaScript への愛を語る機会を与えてくださった皆様に感謝します。

注: たぶんこれでいいと思う...

投稿者 kazuho : 2006年10月19日 13:56 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/840

このリストは、次のエントリーを参照しています: JavaScript は、なぜプロトタイプベースなのか:

» javascript vs perl - オブジェクトのメモリー効率 from 404 Blog Not Found
というわけで、間違っていることを実証してみました。 Kazuho@Cybozu Labs: JavaScript は、なぜプロトタイプベースなのか決して... [続きを読む]

トラックバック時刻: 2006年10月20日 02:48

» [Programming][OOP]Prototype based OOP と Class based OOP from odz buffer
ref:Kazuho@Cybozu Labs: JavaScript は、なぜプロトタイプベースなのか ref:404 Blog Not Found:j... [続きを読む]

トラックバック時刻: 2006年11月07日 15:46

コメント

> 決して専門ではないので

Kazuho先生、全然専門じゃないですか!w

投稿者 yu : 2006年10月27日 19:08