266

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

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

4

8 に答える 8

308

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

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

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

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

利点

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

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

于 2008-10-09T07:38:11.193 に答える
57

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

于 2008-10-09T07:26:18.377 に答える
36

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

于 2008-10-09T07:27:12.760 に答える
11

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

オブジェクトは本質的にJavaスクリプトの関数であるため(クロージャーも)、上記が可能です。

于 2008-10-09T07:45:21.520 に答える
8

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

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

2) クラスを使用しない

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

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

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

于 2016-06-10T12:19:03.137 に答える
6

コンパイル時にクラスではなく実行時にオブジェクトを使用して新しいオブジェクトを構築する場合、これにより、オブジェクトの詳細を知らなくてもオブジェクトを拡張できる可能性があります。もちろん、使い方によってはすぐにデメリットになるかもしれません。ここでは言語について何も仮定していないので、動的ではないjavascript以外の言語に適用できます。

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

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

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

于 2008-10-09T08:14:09.403 に答える
6

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

于 2008-10-09T07:25:55.163 に答える