«前の日記(2008年04月16日) 最新 次の日記(2008年04月21日)» 編集

ema log


2008年04月18日 「プロトタイプベースの誤解」読書メモ [長年日記]

_ [Programming]「プロトタイプベースの誤解」読書メモ

“オブジェクト指向”の本質」はこれから読む。

プロトタイプベース ≒ インスタンスベース

sumim さんによると、一緒だと思って問題ないようです。

== だけど === ではないぐらいな感覚なんだろうか。

ただ、コメント欄によると、厳密には違いがある様子。

書き方が悪く、混乱させてごめんなさい。インスタンスベースは、プロトタイプベースの特徴がもっと正確に伝わるようにただ呼び名を変えただけのものなので、両者はおおざっぱには同じものです。今までの理解で問題ないと思いますよ。

非常に細かい厳密なことを言えば、プロトタイプベースはクラスがあってはダメだけど、インスタンスベースはべつにこだわらない…という違いはあるかもしれませんが、そんなことを守って「プロトタイプベース」という言葉を使い分ける人はめったにいないと思います。

[プロトタイプベースの誤解より引用]

「言葉を使い分ける人はめったにいないと思います」ってことで良いんでしょう。

「インスタンスベース」 - オブジェクトがそれが属するクラスによらず独自のメソッドやインスタンス変数を持てること

オブジェクト(インスタンス)自身に「メソッド/スロット/関数」や「変数/プロパティ」を登録できることが本質だと。

クラスが存在しても良いし、事実 JavaScript 2.0 ではクラスが導入されている。

結局、メソッド探索を言語実装レベルでとらえるのが一番わかりやすい気がする。

「プロトタイプの複製でオブジェクトを生成する」という特徴は、(クラスが必須のクラスベースでは、クラスを new できるのに対し)インスタンスベースでクラスがないときに使われるオブジェクト生成のバリエーションのひとつ

手間はかかるけど、別に Factory パターンなどでオブジェクト生成することもできるわけか。

オブジェクト生成にからめた「プロトタイプベース」関連の用語

「プロトタイプとクローン(コピー)」、「ペアレントとチャイルド」という用語やそれぞれの関係も混乱の元になりがちですね。これらも、オリジナルとその浅いコピーの関係なら「プロトタイプとクローン」、委譲先としての情報を持つだけなら「ペアレントとチャイルド」と統一してはどうかと個人的には思うのですが、現状、ペアレント(移譲先の)スロットを「プロトタイプ」やそれに準ずる呼称とする言語が多い(関連して「プロトタイプ・チェーン」なんて言葉があるくらいですし…)ので、難しいですね。

[プロトタイプベースの誤解より引用]

この用語の違いがよく分からなかった。

ただ、「コピー/クローン(copy / clone / duplicate)」しただけなら、「プロトタイプとクローン」。

「コピー/クローン(copy / clone / duplicate)」して、「メソッド/スロット」を追加したり、何らかの改変を加えると「ペアレントとチャイルド」。

という読み取りで良いのだろうか。

本日のツッコミ(全2件) [ツッコミを入れる]
_ sumim (2008年04月18日 15:45)

お邪魔します。説明が足りず不親切でしたね。ごめんなさい。<br><br>プロトタイプの浅いコピーがクローンです。したがって、生成されたばかりのクローンはプロトタイプと全く同じスロットを持っていて、同じ振る舞いをします。しかし。ひとたび生成されれば、もう、クローンはプロトタイプから独立しているので、プロトタイプのスロットを変更してもクローンには影響しません。逆もまたしかり。いうまでもなく、どちらかのスロットを変更した時点で両者の振る舞いは(変更箇所については)異なるようになります。<br><br>対して、ペアレントへの委譲のための特殊なスロットだけを持っているのがチャイルドです。チャイルドへのアクセスはすべてペアレントに丸投げされるので、見かけ上、チャイルドとペアレントはまったく同じ振る舞いをします。ペアレントのスロットを変更すると、チャイルドにも波及します。しかし、チャイルドにペアレントと同名のスロットが追加されると、そのスロットに関してはペアレントとチャイルドは違う振る舞いをすることになります。<br><br>こんな感じでいかがでしょう。

_ ema (2008年04月19日 05:55)

sumim さん、詳細な解説をありがとうございます!<br>おかげで、すっきりしました!!<br><br>プロトタイプとクローンは完全に枝分かれした存在で、ペアレントとチャイルドは委譲関係という繋がりを残した関係なのですね。<br><br>自分なりに JavaScript で整理してみたいと思いましたが、混乱してしまいました。明日は時間があるので、ゆっくり考えてみます。