「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > コンストラクターの外で定義されているプロトタイプメソッドの理由と利点

コンストラクターの外で定義されているプロトタイプメソッドの理由と利点

2025-04-19に投稿されました
ブラウズ:540

Why Should Prototype Methods Be Defined Outside the Constructor Function?

コンストラクター関数内のプロトタイプメソッドの割り当て:潜在的な落とし穴

スタイリスト的に、プロトタイプ方法を定義するための次の構造を好むものもあります:

var Filter = function( category, value ){
  this.category = category;
  this.value = value;

  // product is a JSON object
  Filter.prototype.checkProduct = function( product ){
    // run some checks
    return is_match;
  }
};
varフィルター=関数(カテゴリ、価値){ this.category = category; this.value = value; //製品はJSONオブジェクトです filter.prototype.checkproduct = function(crodce){ //いくつかのチェックを実行します IS_MATCHを返します。 } };

ただし、このアプローチには、代替構造と比較していくつかの欠点があります。 this.category = category; this.value = value; }; // var filter = function(){...} filter.prototype.checkproduct = function(crodce){ //いくつかのチェックを実行します IS_MATCHを返します。 }
var Filter = function( category, value ){
  this.category = category;
  this.value = value;

  // product is a JSON object
  Filter.prototype.checkProduct = function( product ){
    // run some checks
    return is_match;
  }
};

機能的欠点:

  1. プロトタイプメソッドは複数回割り当てられます。プロトタイプメソッド内のコンストラクターのうち、予期しない結果につながる可能性があります。例:
  2. var counter = function(initialValue){ var値= initialValue; //製品はJSONオブジェクトです counter.prototype.get = function(){ 返品値。 } }; var c1 = new Counter(0); var C2 =新しいカウンター(10); console.log(c1.get()); //出力10、出力0
このシナリオでは、get()はC1の代わりにC2のローカル変数値の値を返します。これは、メソッドクロージャーがプロトタイプの最近定義された値を参照するためです。コンストラクター:
var Counter = function(initialValue){
  var value = initialValue;

  // product is a JSON object
  Counter.prototype.get = function() {
      return value  ;
  }
};

var c1 = new Counter(0);
var c2 = new Counter(10);
console.log(c1.get());    // outputs 10, should output 0

結論:

最初の構造は様式的に心地よいかもしれませんが、機能的な欠点と範囲の問題を導入できます。一般に、潜在的な問題を回避するために、コンストラクター関数の外側(2番目の構造のように)外部にプロトタイプメソッドを割り当てることをお勧めします。
    最新のチュートリアル もっと>

    免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

    Copyright© 2022 湘ICP备2022001581号-3