プロトタイプ経由でメソッドを定義する場合と、コンストラクターで this を使用する場合、実際にパフォーマンスに違いがあるのでしょうか? 質問する

プロトタイプ経由でメソッドを定義する場合と、コンストラクターで this を使用する場合、実際にパフォーマンスに違いがあるのでしょうか? 質問する

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ブラウザが簡単に実行できる最適化は、この非常に一般的なパターンを認識し、実際にオブジェクトのすべてのインスタンスを参照させることのようです。同じこれらの「コンストラクタ関数」を介して定義された関数のコピー。その後、明示的に変更された場合にのみ、インスタンスに関数の独自のコピーを提供できます。

洞察力があれば、あるいは、さらに良いのは、現実世界での経験- 両者のパフォーマンスの違いについて教えていただけると非常に助かります。

ベストアンサー1

見るhttps://jsperf.app/prototype-vs-this

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

アプリにパフォーマンスのボトルネックがある場合、たとえば、任意のアニメーションの各ステップで 10,000 を超えるオブジェクトをインスタンス化している場合を除き、これが原因である可能性は低くなります。

パフォーマンスが重大な懸念事項であり、マイクロ最適化を行いたい場合は、プロトタイプを使用して宣言することをお勧めします。それ以外の場合は、最も適切なパターンを使用してください。

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

おすすめ記事