クラスベースかプロトタイプチェーンかの違いは、属性の名前空間を検索するときの、チェーンの先頭以外の「何か」を特別視するかしないかでしかない。特別視する方法は静的な型システムに組み込むこともあれば、「クラス」というファーストクラスオブジェクトへのチェーンのこともある。
2013-07-05 15:25:50@methane その定義はよくないのでは? たとえばC++やJavaでは、メソッド「しか」オーバーライドできません。つまり、継承の意味とinstantiationの意味が明確に違う
2013-07-05 15:30:05@kazuho ここでは「属性」が具体的に何を指しているかは問題にしていません。「何か」と言い換えた方がいいですがよけい判りにくくなる気が。。。
2013-07-05 15:33:25@methane C++でも親クラスで定義されたメンバ「変数」にもアクセスできるわけです。つまり、メソッドのルックアップ手法(オーバーライドできる)と、変数のルックアップ手法(静的に解決する)が異なる
2013-07-05 15:35:33@methane タイミングの問題ではなくて、インスタンス単位のものとクラス単位の2種類のルックアップ手法を用意するのが古典的なclass-based OOである、というkとおです
2013-07-05 15:38:46@kazuho とはいえ、名前探索時の「先頭」がインスタンスであることを仮定してしまっているので、その点はやはり C++ 等とうまくフィットしませんね。先頭とかバッサリ切って、名前解決のチェーンに任意のオブジェクトを利用できるかどうかと言ったほうが良かったです。
2013-07-05 15:39:23@methane えぇ。結局、ルックアップ手法を分けるのは効率のためだったわけで、スクリプト言語だと全部delegationで実装して、あとはsyntax sugarをどうふりかけるかみたいになってきてるのかなぁという印象をもってます
2013-07-05 15:44:17@kazuho そもそも、正確な定義をしたいんじゃなくて、JSに関するプレゼンでクラスベースとプロトタイプベースの違いを簡単に説明する場合に、どう表現したら JS と Python, Java, C++ etc.. との違いをなんとなく伝えられるかを考えてます。
2013-07-05 15:44:29@methane 派生(inheritance)と実体化(instantiation)を言語仕様として別個のものとしているか否か、じゃダメでしょうか? 実装の話に入るのではなくて
2013-07-05 15:48:15@kazuho JS も new や {} と __proto__ = some_object は別ですよね?そういう意味ではなく?
2013-07-05 15:49:49@methane class-based OOは型しか実体化できない、prototype-based OOは任意のオブジェクトをプロトタイプとして実体化できる、でいいんじゃないかなーと
2013-07-05 15:55:29@kazuho Python だと obj.__class__ = other_class でチェーンいじれるので、実体化するときだけじゃなくてチェーンに注目してたんですが、そこまで一般化するの難しい。
2013-07-05 15:58:06@methane なるほどなるほど。rubyも特異メソッドとかあった気がするし、LL間の比較で言うと、できることの差はあんまりない感じですね #Perlを除く
2013-07-05 15:59:25@kazuho 僕は JavaScript に (syntax sugarであろうと) class 構文が入ってそれを使ったらもうそれは立派な class based OOP だと思います。
2013-07-05 16:00:28@kazuho php のクラスシステムは型と別れるというか、型システムが2重になってますね。 function (int $foo) すると、 int 型の値じゃなくた、 class int {} のインスタンスを受け取ります。
2013-07-05 16:01:25@kazuho で、クラスシステムは、実装は Python とかに近くても、言語仕様はほぼ静的で、VMに手を入れるような高度な黒魔術を使わないと実行時に弄ることは不可能です。
2013-07-05 16:02:23Class based OOPとかPrototype based OOPとかOOPの実装手法の話ってだけで、prototypeなOOP実装だとより自由度が高くてメタプログラミングしやすいってだけの話じゃないすか? CLOSとかもOOP実装の一形態だし
2013-07-05 17:02:20