62

JavaScript では、「クラス」を作成してパブリック関数を与える方法が 2 つあります。

方法 1:

function MyClass() {
    var privateInstanceVariable = 'foo';
    this.myFunc = function() { alert(privateInstanceVariable ); }
}

方法 2:

function MyClass() { }

MyClass.prototype.myFunc = function() { 
    alert("I can't use private instance variables. :("); 
}

メソッド 2 を使用すると、すべてのインスタンスが関数の同じコピーを共有するため、それぞれが独自の関数を取得するよりも効率的であると言う人を何度も読みました。ただし、プロトタイプを介して関数を定義することには大きな欠点があります。プライベートなインスタンス変数を持つことができなくなります。

理論的には、方法 1 を使用すると、オブジェクトの各インスタンスに関数の独自のコピーが与えられます (したがって、割り当てに必要な時間は言うまでもなく、より多くのメモリが使用されます) - 実際に何が起こるのでしょうか? Web ブラウザーが簡単にできる最適化は、この非常に一般的なパターンを認識し、実際にオブジェクトのすべてのインスタンスがこれらの「コンストラクター関数」を介して定義された関数の同じコピーを参照するようにすることです。その後、後で明示的に変更された場合にのみ、インスタンスに関数の独自のコピーを与えることができます。

両者のパフォーマンスの違いについての洞察、またはさらに良い実世界での経験は、非常に役立ちます。

4

7 に答える 7

63

http://jsperf.com/prototype-vs-thisを参照してください

プロトタイプを介してメソッドを宣言する方が高速ですが、これが適切かどうかは議論の余地があります。

アプリにパフォーマンスのボトルネックがある場合、たとえば、任意のアニメーションのすべてのステップで 10000 以上のオブジェクトをインスタンス化している場合を除き、これが発生する可能性はほとんどありません。

パフォーマンスが深刻な問題であり、マイクロ最適化を行いたい場合は、prototype で宣言することをお勧めします。それ以外の場合は、最も理にかなったパターンを使用してください。

JavaScript では、非公開として表示されることを意図したプロパティの前にアンダースコアを付ける規則があります (例: _process())。ほとんどの開発者は、社会契約を放棄する意思がない限り、これらのプロパティを理解して回避しますが、その場合は、それらに対応しない方がよいでしょう。私が言いたいのは、おそらく真のプライベート変数は本当に必要ないということです...

于 2012-08-29T15:00:10.810 に答える
1

多くのインスタンスを作成している場合にのみ違いが生じます。それ以外の場合、メンバー関数を呼び出すパフォーマンスは、どちらの場合もまったく同じです。

これを実証するために、jsperf でテスト ケースを作成しました。

http://jsperf.com/prototype-vs-this/10

于 2014-01-30T00:39:54.553 に答える
0

つまり、メソッド 2 を使用して、すべてのインスタンスが共有するプロパティ/メソッドを作成します。それらは「グローバル」になり、それに対する変更はすべてのインスタンスに反映されます。インスタンス固有のプロパティ/メソッドを作成するには、メソッド 1 を使用します。

もっと良いリファレンスがあればいいのにと思いますが、とりあえずこれを見てください。同じプロジェクトで異なる目的のために両方の方法をどのように使用したかを見ることができます。

お役に立てれば。:)

于 2012-08-29T15:01:48.797 に答える