首頁 >web前端 >js教程 >為什麼原型方法應該在建構函式之外定義?

為什麼原型方法應該在建構函式之外定義?

DDD
DDD原創
2024-10-30 21:14:02691瀏覽

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() 傳回 c2 的局部變數值而不是 c1 的值,因為方法閉包引用原型上最近定義的值。

其他注意事項:

  • 構造函數以外的原型:第一個結構禁止在構造函數之外訪問原型,可能會限制靈活性。
  • 方法放置:在第二種結構中,方法直接放置在物件上而不是原型上,這在某些情況下可能會提高效能。

結論:

雖然第一個結構在風格上可能令人愉悅,但它可能會帶來功能缺陷和範圍問題。通常建議在建構函數之外分配原型方法(如第二個結構中),以避免潛在的問題。

以上是為什麼原型方法應該在建構函式之外定義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn