ホームページ >ウェブフロントエンド >jsチュートリアル >プロトタイプ メソッドをコンストラクター関数の外部で定義する必要があるのはなぜですか?

プロトタイプ メソッドをコンストラクター関数の外部で定義する必要があるのはなぜですか?

DDD
DDDオリジナル
2024-10-30 21:14:02693ブラウズ

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 Filter = function( category, value ){
  this.category = category;
  this.value = value;
};// var Filter = function(){...}

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

機能的な欠点:

  1. 冗長性と非効率な割り当て: プロトタイプ メソッドは複数回割り当てられますが、これは不必要であり、パフォーマンスに影響を与える可能性があります。
  2. スコープの問題: プロトタイプ メソッド内からコンストラクターのローカル変数を参照すると、予期せぬ結果をもたらします。例:
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

このシナリオでは、メソッド クロージャがプロトタイプで最後に定義された値を参照するため、get() は c1 の代わりに c2 のローカル変数値を返します。

その他の考慮事項:

  • コンストラクター外のプロトタイプ作成: 最初の構造ではコンストラクター外のプロトタイプへのアクセスが禁止されており、柔軟性が制限される可能性があります。
  • メソッドの配置: 2 番目の構造では、メソッドはプロトタイプではなくオブジェクトに直接配置され、場合によってはパフォーマンスが向上する可能性があります。

結論:

最初の構造はスタイル的には好ましいかもしれませんが、機能的な欠点やスコープの問題が発生する可能性があります。一般に、潜在的な問題を回避するために、(2 番目の構造のように) コンストラクター関数の外側にプロトタイプ メソッドを割り当てることをお勧めします。

以上がプロトタイプ メソッドをコンストラクター関数の外部で定義する必要があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。