20

readerfromの継承のショートコードを書きましたPerson

<script>

/* Class Person. */
function Person(name) {
    this.name = name;
}

Person.prototype.getName = function() {
    return this.name;
}

var reader = new Person('John Smith');
alert(reader.getName());

</script>

または、の行を削除 Person.prototype.getName = function() { return this.name; }して、Personオブジェクトに作成することもできます。例えば

<script>
/* Class Person. */
function Person(name) {
    this.name = name;
    this.getName = function() { return this.name;}
}

var reader = new Person('John Smith');
alert(reader.getName());

</script>

getName()これらの両方のケースで呼び出したときに同じ結果が得られました。では、それらはどのように違うのでしょうか?

4

6 に答える 6

24

プロトタイプに何かを置くと、オブジェクトのすべてのインスタンスがメソッドの同じコードを共有します。それらはすべて同じ関数インスタンスを使用しています。

にメソッドを配置するだけで、すべてのオブジェクトインスタンスに同じメソッドの this独自のコピーがあります。

使用するprototype方がはるかに効率的です。通常、すべてのインスタンスで同じメソッドを使用する必要があるため、通常はメソッドがプロトタイプに配置されますが、すべてのインスタンスで同じプロパティを共有する必要がないため、プロパティはインスタンス自体に配置されることに注意してください。

コメントとして、オブジェクトのコンストラクター関数にメソッドを配置すると、事実上「静的」メソッドが作成されます。オブジェクトのインスタンスにはそのメソッドがありません。コンストラクター関数ですべてのインスタンスにアクセスする必要があります。したがって、あなたの場合、Person.someMethod()

于 2012-07-18T12:34:05.213 に答える
4

メソッドをコンストラクターに入れ、そのコンストラクターからオブジェクトを作成すると、各オブジェクトは独自のgetName関数を実行します。10個Personのインスタンスの場合、それぞれが独自のgetName、したがって10個の個別のgetName関数を実行します。

コンストラクターのプロトタイプに配置getNameすると、同じgetName関数がすべてのインスタンスで共有/継承されます。したがって、の10個のインスタンスの場合Person、それぞれがgetName1つの関数のみを参照しgetNameます。

メソッドはインスタンス間で共有されるため、プロトタイプを使用するとメモリが節約され、1つだけが使用されます。

于 2012-07-18T12:35:32.900 に答える
3

違いは、プロトタイプに配置すると、のすべてのインスタンスがPerson同じコードを共有することです。他の何かを割り当てることで、のすべてのインスタンスをgetName変更できます。getNamePerson

Person.prototype.getName = function() { return 'Mr Jones' };

また、同じコードを共有するため、メモリの消費が少なくなりgetNameます。インスタンスごとに1つのコピーではなく、関数のコピーが1つだけになります。

Personもう1つの違いは、後で別のクラスのプロトタイプとして設定できることです。たとえばMan、プロパティ/メソッドを継承します。

更新:プロトタイプの他のプロパティを説明する良い投稿があります:https ://stackoverflow.com/a/1534286/295262

于 2012-07-18T12:35:48.027 に答える
2

違いは、Personクラスをさらに拡張すると、サブクラスはgetName()メソッドを継承しないということです。

編集:私は上記のステートメントで正しくありませんでした。jsfiddleでテストしました。プロトタイプでメソッドを定義するか、関数インスタンス自体でメソッドを定義するかに関係なく、チェーン内のサブクラスで使用できます。

これがその証拠です:http://jsfiddle.net/u8qrd/

メソッドをプロトタイプにアタッチすることには、パフォーマンス/メモリの利点があることを理解しています。それからのAppartは、継承に関しては動作上の違いはありませんか?

(うまくいけば、ここで質問することによってSOルールに違反していません)

于 2012-07-18T12:35:21.527 に答える
0

prototypeクラスベースの単語では、とを介して関数を宣言することの違いは次のthisようになります。

プロトタイプ:

インスタンスの関数は次のようになります。

somefunc = function(){super()/*call the function of the super-class*/};

これ:

インスタンスの関数は次のようになります。

somefunc = function(){/* Do same stuff as in the prototype func declared */};

これで、プロトタイプの関数を変更しても、インスタンスには影響しません。

于 2012-07-18T12:45:19.470 に答える
0

オブジェクトコンストラクターに関数を追加するとthis.functionname、そのコンストラクターによって作成されたすべてのオブジェクトは、その関数の独自のコピーを作成します。これもメモリを使用します。同じコンストラクターによって作成された複数のオブジェクトがあり、それが必要とするメモリの量を想像してみてください。一方、cunstructorName.prototype.functionName関数を使用して作成すると、メモリに1回だけ読み込まれ、すべてのオブジェクトが同じプロトタイプ関数コンストラクターを共有します。このアプローチにより、コードのロードと操作が高速になり、メモリの大きなチャンクも節約されます。

于 2018-09-12T09:51:28.723 に答える