web-dev-qa-db-ja.com

Javascriptがプロトタイプベースの言語であることはどういう意味ですか?

Javascriptの主な利点の1つは、プロトタイプベースの言語であると言われています。

しかし、Javascriptがプロトタイプベースであることはどういう意味ですか。なぜそれが利点なのでしょうか。

245
Jonas Pegerfalk

プロトタイプ継承は、オブジェクト指向コードの再利用の形式です。 Javascriptは、プロトタイプ継承を使用する唯一の[メインストリーム]オブジェクト指向言語の1つです。他のほとんどすべてのオブジェクト指向言語は古典的です。

classical inheritanceでは、プログラマはオブジェクトを定義するクラスを記述します。同じクラスから複数のオブジェクトをインスタンス化できるため、プログラム内の複数のオブジェクトを記述するコードが1か所にあります。その後、クラスを階層に編成して、コードの再利用を促進できます。より一般的なコードは、より高いレベルのクラスに保存され、そこからより低いレベルのクラスが継承されます。これは、オブジェクトが同じクラスの他のオブジェクト、およびその親クラスとコードを共有していることを意味します。

プロトタイプ継承形式では、オブジェクトは他のオブジェクトから直接継承します。クラスに関するすべてのビジネスはなくなります。オブジェクトが必要な場合は、オブジェクトを作成するだけです。ただし、コードの再利用は依然として価値のあることであるため、オブジェクトを階層でリンクすることは許可されています。 javascriptでは、すべてのオブジェクトに、それを作成したオブジェクトへの秘密のリンクがあり、チェーンを形成しています。オブジェクトが所有していないプロパティを要求されると、その親オブジェクトが要求されます...プロパティが見つかるまで、またはルートオブジェクトに到達するまで、チェーンを続けて移動します。

JavaScriptの各関数(オブジェクト自体)には、実際には「プロトタイプ」と呼ばれるメンバーがあります。これは、オブジェクトに値が要求されたときに値を提供する役割を果たします。このメンバーを使用すると、コンストラクターメカニズム(オブジェクトを関数から構築する)が機能します。関数オブジェクトのプロトタイプにプロパティを追加すると、構築されたオブジェクトだけでなく、それを継承するすべてのオブジェクトで利用できるようになります。

利点

プロトタイプの継承がコード再利用の有利な形である理由について、厳格な規則がない場合があります。コードの再利用自体が有利であり、プロトタイプ継承は賢明な方法です。プロトタイプの継承は、コードの再利用のかなり単純なモデルであり、そのコードはで大幅に再利用できると主張するかもしれません直接的な方法。しかし、古典的な言語も確かにこれを達成できます。

サイドノート:@ Andrew Hedgesは、実際には 多く プロトタイプ言語。これらの他のものが存在することは注目に値しますが、どれも主流に近いものではないことにも注目に値します。 NewtonScriptはしばらくの間は牽引力を持っているように見えましたが、そのプラットフォームで死にました。プロトタイプ機能を追加する方法で、いくつかの現代言語を拡張することも可能です。

278
keparo

プロトタイプベースの言語は、クラスとオブジェクトを区別しません。単にオブジェクトを持っています。プロトタイプベースの言語には、プロトタイプオブジェクトという概念があります。これは、新しいオブジェクトの初期プロパティを取得するためのテンプレートとして使用されるオブジェクトです。オブジェクトは、作成時または実行時に独自のプロパティを指定できます。さらに、任意のオブジェクトを別のオブジェクトのプロトタイプとして関連付けることができます。2番目のオブジェクトが最初のオブジェクトのプロパティを共有できるようにします。

52
Guido

プロトタイプベースのプログラミングは、クラスが存在しないオブジェクト指向プログラミングのスタイルであり、動作の再利用(またはクラスベースの言語での継承)は、プロトタイプとして機能する既存のオブジェクトを複製することによって実行されます。

31
CMS

利点/欠点は、実行時にクラス(静的コード)を定義せずに新しい種類のオブジェクトを作成できることです。ほとんどの機能と同様に、それを利点/欠点に変えるのは開発者次第です。

オブジェクトは本質的にJavaスクリプト(クロージャーも)の関数です。

10
questzen

コンパイル時のクラスではなく、実行時にオブジェクトを使用して新しいオブジェクトを作成する場合、詳細を知らなくてもオブジェクトを拡張できる可能性が広がります。もちろん、使用状況によってはすぐに不利になる場合があります。ここでは言語について何も仮定していないため、動的ではないjavascript以外の言語に適用できます。

myobject.prototype=unkownobject;
myobject.newproperty=1;

ほぼどこからでもオブジェクトを取得できます。独自のコード、ネットワーク、データベース、外部リンケージなどから。

言語は、javascriptのようなプロトタイプの継承を実装する必要がないことに注意してください。 javascriptでは、プロトタイプオブジェクトは単に共有されるだけであり、そのプロパティも継承者間で共有されます。別の方法は、プロトタイプのすべてのプロパティを新しいオブジェクトにコピーすることです。各アプローチには、さまざまな状況での長所があります。私は2番目が好きですが、それはjavascriptが行うことではありません。

5
artificialidiot

クラス構造を宣言する代わりに、同じ型のオブジェクトを作成し、オブジェクトのプロトタイプを使用して好きなときにいつでも定義に追加できます。通常の方法よりも柔軟です。

5
Greg

すべての答えを読んだ後、これが結論です

1)オブジェクトが他のオブジェクトから直接継承される継承

2)クラスを使用しない

3)インスタンスベースのプログラミングまたはクラスレスプロトタイプ指向プログラミングとも呼ばれます

4)動作の再利用は、プロトタイプとして機能する既存のオブジェクトを複製することにより実行されます

5)新しいオブジェクトのテンプレートとして使用されるオブジェクトは、初期プロパティを取得します

4
Sunil Garg