JavaScriptがプロトタイプベースじゃないとかいうの、多分C++やJavaがSmalltalkベースのオブジェクト指向じゃないからオブジェクト指向だとは認められないというのと一緒だと思う(悪い意味じゃなく、より厳格にオブジェクト指向を捉えている方なんだろうなという意味)。
JavaScriptがプロトタイプベースじゃないとかいうの、多分C++やJavaがSmalltalkベースのオブジェクト指向じゃないからオブジェクト指向だとは認められないというのと一緒だと思う(悪い意味じゃなく、より厳格にオブジェクト指向を捉えている方なんだろうなという意味)。
ECMAScript2015でclassが追加されたからクラスベースというのは、インスタンス化してなくてもプロパティを使うことができるということを考えれば、クラスとインスタンスの明確な区別はないわけだし、それは間違いなのでは?
やばい、この定義で行くと、Pythonはクラスベースではないことになってしまう。でもクラスベースだと言及してる人いないからな。
Pythonプロトタイプベース説を後押しする記事。関係ないけど、プロトタイプベースにインスタンス化は必要ないはずなのでそこは違いますな、記者さん。 news.mynavi.jp/article/python…
ただ挙動がすっごくJavaScriptだし、純粋なプロトタイプベースと比べればプロトタイプベースではないがJavaScriptをプロトタイプベースだと言うのであれば、Pythonもプロトタイプベースと言うことになる。
Python、ヤバいプログラミング言語だな。深堀りすればどんどん奇妙なところが出てくる。面白い。
まぁ、staticメソッドを使えば、JavaでもJavaScriptのプロトタイプベース的なOOPが可能になるし(唯一違うのはPythonではインスタンスメソッドもインスタンス化が必須ではないと言うこと)、結局クラスベースとプロトタイプベースにあまりはっきりとした違いはないのかもね。
多分インスタンス化が必要なメソッドや変数があるのがクラスベースで、それがなくクラスとインスタンスの明確な区別がないのがプロトタイプベースと言う感じなんだろうなぁ。
あとはプロトタイプからクローンができるかできないかかな。JavaScriptとPythonはクローンがないように思えるかもしれないけど、多分インスタンス化がそれ。で、そこから独自のプロパティ(Pythonではインスタンス変数/メソッド)が追加できるのね。
なるほど。 プロトタイプベースはクラスがなくてもOOPができることがまず第一前提なのか。確かに、JavaScriptではクラスがなくてもOOPは可能だし、Pythonはclassを一旦passで定義しないとできないかも。
そもそもPythonはselfにクラスを渡せるのがな(そもそも前提仕様としてすべての変数が動的であるため、selfは特に使ってなければ1とかでも良いわけで)。これが勘違いさせてしまう最も大きな要因。Rubyではこんなことはない。
まぁPythonではまずクラスがないとオブジェクトを生成できないけど(クラスもオブジェクトである。これAlan Kay氏の考え方ですね)他言語と比べてプロトタイプベースライクなOOPがしやすいということですな。