9

プロトタイプは、オブジェクトのクラスのプロパティとメソッドを宣言するために使用されます。プロトタイプを使用する利点の 1 つは、クラスのすべてのインスタンスがプロトタイプのプロパティとメソッドを指すため、メモリを節約できることです。

プロトタイプは、プロトタイプ チェーンによる継承に使用されます。

私の質問はとても簡単です。できるのにプロトタイプを使用する理由:

function car() {
    this.engine = "v8";
}
function mustang() {
    // nm, no good way to inherit without using prototypes
}

そうですか?したがって、プロトタイプの主な目的は 3 つあります。

  1. メモリを節約する
  2. 静的プロパティを提供する
  3. 参照型がスーパークラスから継承する唯一の方法です
4

6 に答える 6

1

あなたの3つのポイントについて:

  1. プロトタイプは、特に長くなったり、多くのメンバーを含むプロトタイプ チェーンの場合、必ずしもよりパフォーマンスが高いとは限りません。プロトタイプが小さく、チェーンが短いほど、ブラウザーのコンパイラーはそれを最適化できます。最終的に、この質問は、個々のアプリケーション、個々のニーズ、および対象となるブラウザー (パフォーマンスが大きく異なる可能性があります) について尋ねる必要があります。
  2. 定義上、静的メンバーにはオブジェクトが必要です。つまり、静的メンバーは、特定のインスタンスではなく、オブジェクト自体に属します。オブジェクトは、JavaScript で静的プロパティを作成する唯一の方法です。オブジェクトの「特別な」種類であるオブジェクト リテラルは、本質的に静的であることに注意してください。
  3. 継承のようなものを可能にする独自のタイプのオブジェクトを実装することもできますが (つまりjQuery.extend)、参照型に関する限り、継承を作成する唯一の方法はプロトタイプです。
于 2014-01-24T01:54:39.343 に答える
0

プロトタイピングはそれ以上のものです。実行時にメソッドとプロパティを使用して、クラスとオブジェクトの既存のインスタンスを拡張することもできます。

これは非常にわかりやすい方法で説明する必要があります: http://javascript.info/tutorial/inheritance

于 2014-01-22T13:24:52.203 に答える
0

あなたのポイントについて:

  1. 特に関数に関しては、間違いなくパフォーマンスが向上します。プロトタイプで関数を宣言する方がはるかに優れています。
  2. を書くことで情報を取得できるように、「パブリック」プロパティと言うつもりだったと思いますsome_instance.foo。「静的」プロパティ/メソッドは異なります (以下を参照)。
  3. 正しい。継承は、実際にはプロトタイプからのみ発生します。

これが役立つかどうかを確認するために、いくつかのことを説明しましょう。JavaScript で新しい「クラス」を作成するのは、かなり簡単なプロセスです。

var MyClass = new Function();

この時点で、エンジンは新しいクラスを認識しており、「クラス」の新しいインスタンスを作成するときに (パフォーマンスに関して) 「何をすべきか」を認識しています。

var my_instance = new MyClass();

プロトタイプを変更したい場合は、すべてのインスタンスが同じプロトタイプを共有しているため、すべてのインスタンスが更新されることがわかります。

MyClass.prototype.name = "default name";
console.log( my_instance.name ); //=> default name

これでエンジンは、文字列値を期待する「名前」プロパティがあることを認識します...それらのリソースをクラスのすべての新規および既存のインスタンスに割り当てます...これは非常に便利です。このように既存の「クラス」のプロトタイプを変更することは、コストのかかるプロセスであり、頻繁に実行するべきではないことに注意してください (ただし、実行することを恐れないでください)。

インスタンスでアドホックなプロパティ/メソッドを宣言することのパフォーマンスの長所と短所については、私は本当に話すことができません:

my_instance.foo = function() { /* this is not in the prototype chain */ };

私の推測では、これはエンジンにとって非常に単純であり、同時に何万ものオブジェクトに対してこれを行う場合を除き、大したことではありません。

プロトタイプ IMO を使用する主な利点は、コードを記述してメソッドの機能を拡張し、それに応じて「クラス」のすべてのインスタンスが更新されることを認識できることです。

var old_foo = MyClass.prototype.foo;
MyClass.prototype.foo = function() {
    /* new business logic here */

    // now call the original method.
    old_foo.apply(this, arguments);
};

「静的」プロパティについては、「クラス」(コンストラクタ) 自体で宣言します。

// example static property
MyClass.num_instances = 0;

これで、次のような init/destroy メソッドを作成できます。

MyClass.prototype.init = function() {
    this.constructor.num_instances++;
};

MyClass.prototype.destroy = function() {
    this.constructor.num_instances--;
};

// and call the init method any time you create a new instance
my_instance.init();
console.log( MyClass.num_instances ); //=> 1

var instance_2 = new MyClass();
instance_2.init();
console.log( MyClass.num_instances ); //=> 2

instance_2.destroy();
console.log( MyClass.num_instances ); //=> 1

それが役立つことを願っています。

于 2014-01-28T10:39:30.067 に答える