2011-09-28 71 views
3

忽略了一個事實,這是由許多框架實現..什麼是更好的方法,以原型爲多種類型的

什麼是原型多個對象類型的最佳途徑。

例如,我應該寫:

Element.prototype.bind = function(eventType, fn) { 
    this.addEventListener(eventType, fn, false); 
}; 
NodeList.prototype.bind = function(eventType, fn) { 
    for (var i = 0, l = this.length; i < l; i++) { 
     this[i].addEventListener(eventType, fn, false); 
    } 
}; 

Object.prototype.bind = function(eventType, fn) { 
    if (this instanceof Element) { 
     this.addEventListener(eventType, fn, false); 
    } else if (this instanceof NodeList) { 
     for (var i = 0, l = this.length; i < l; i++) { 
      this[i].addEventListener(eventType, fn, false); 
     } 
    } 
} 
+1

http://jsperf.com/prototype-methods好了,我發現,第一種方法是更好的表現,我會承擔它也提供了較少的衝突機會? – rlemon

+0

是的,它也更整潔,更容易閱讀恕我直言...如果你想在多種類型相同的功能,那麼代碼是更清潔。想象一下這個Element的實例這個OtherType ||的實例...':O –

+0

最好的地方可能就是這樣。你能添加一些上下文嗎?你遇到什麼問題導致你問這個問題? –

回答

3

紅旗:從未延長Object.prototype!它打破for (x in y)(或至少人們對它的工作原理)。

但是,在一般情況下,最好擴展各個類型的原型,而不是嘗試找到一個通用基礎並執行反射檢查。這樣做有兩個基本原因。首先,JavaScript是一種動態類型語言,所以你通常應該更喜歡鴨子打字和基本繼承而不是instanceof和反射。在許多情況下,性能有一點好處,但主要是這樣,所以你不用花時間去對抗語言。其次,這種類型的方法切換意味着切換方法之間的連接,這些連接並不一定存在。在你的示例代碼中,這可以在NodeList版本中看到。從概念上講,列表不應該是任何約束力;如果它有bind方法,它應該簡單地轉化爲在其每個元素上調用bind方法。這確保瞭如果將來需要添加任何額外的步驟(例如,舊的,不符合DOM的瀏覽器的解決方法...),則只需在一個位置執行此操作。

但在「相同功能」的類型轉換角度來看待它給人的假象,既Element.bindNodeList.bind應工作方式相同 - 通過調用addEventListener。以下是我想實現它:

Element.prototype.bind = function(eventType, fn) { 
    this.addEventListener(eventType, fn, false); 
}; 

NodeList.prototype.bind = function(eventType, fn) { 
    for (var i = 0, l = this.length; i < l; i++) { 
     this[i].bind(eventType, fn); 
    } 
}; 
+1

三江源,你要嘗試這個沒有得到掛在我正在伸出'Object.prototype'事實上的第一人。我將從*開始我明白這樣做的意義,但我很欣賞警告*。您的答案中的其他內容完全是我一直在尋找的信息。 – rlemon

相關問題