コンストラクター関数内でプロトタイプ メソッドを割り当てることが、JavaScript では一般的に悪い習慣であると考えられているのはなぜですか?

Barbara Streisand
リリース: 2024-10-30 21:02:02
オリジナル
292 人が閲覧しました

Why is assigning prototype methods inside the constructor function generally considered a bad practice in JavaScript?

コンストラクター内でのプロトタイプ メソッドの割り当て: 潜在的な欠点とスコープの問題

スタイルの好みを優先しながら、潜在的な欠点とスコープの問題に対処することが重要ですコンストラクター関数内のプロトタイプ メソッドの割り当てに関連しています。次のコード構造を考えてみましょう。

構造 1:

<code class="javascript">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;
  }
};</code>
ログイン後にコピー

構造 2:

<code class="javascript">var Filter = function(category, value) {
  this.category = category;
  this.value = value;
};

Filter.prototype.checkProduct = function(product) {
  // run some checks
  return is_match;
}</code>
ログイン後にコピー

欠点とスコープの問題:

1.繰り返されるプロトタイプの割り当てと関数の作成:
構造 1 では、インスタンスの作成ごとにプロトタイプが何度も再割り当てされます。これにより、代入が繰り返されるだけでなく、インスタンスごとに新しい関数オブジェクトが作成されます。

2.予期しないスコープの問題:
構造 1 は予期しないスコープの問題を引き起こす可能性があります。プロトタイプ メソッドがコンストラクターのローカル変数を参照する場合、最初の構造体が意図しない動作を引き起こす可能性があります。次の例を考えてみましょう:

<code class="javascript">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</code>
ログイン後にコピー

この場合、各インスタンスに対して作成された get メソッドは、同じプロトタイプ オブジェクトを共有します。その結果、値変数がインクリメントされ、インスタンス間で共有され、誤った出力が発生します。

その他の考慮事項:

  • 構造 1 は、外部からのアクセスを防止します。 Filter.prototype.checkProduct.apply() を介してプロトタイプを作成します。
  • パフォーマンスの観点からは、メソッドをオブジェクト インスタンスに直接割り当てる方が、プロトタイプを使用するよりも効率的である可能性があります。
  • コンストラクターは、特にローカル変数を参照する場合に、プログラミング上の間違いにつながる可能性があります。

結論:

個人の好みは異なる場合がありますが、潜在的な可能性を認識することが重要です。コンストラクター関数内でのプロトタイプ メソッドの割り当てに関連する欠点とスコープの問題。信頼性と保守性を考慮すると、通常は 2 番目のコード構造が推奨されます。

以上がコンストラクター関数内でプロトタイプ メソッドを割り当てることが、JavaScript では一般的に悪い習慣であると考えられているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!