2010-11-16 67 views
8

我知道如何添加新的方法對每個對象 - 通過擴大對象的原型:增加DOM元素節點的原型?

Object.prototype.foo = function() { }; 

但是,是可以定義爲僅DOM元素節點的新方法? DOM元素節點對象是否有原型?或者是否有一般DOM節點的原型?

或者原型對象只存在於內置對象嗎?

回答

20

是的,但不是在所有瀏覽器中。 Internet Explorer 8支持DOM原型(在某種程度上),Firefox,Chrome,Opera和Safari也是如此。

HTMLElement.prototype.toggle = function() { 
    this.style.display = this.style.display == 'none' ? '' : 'none'; 
} 

許多人認爲通過原型擴展DOM對象是一種不好的做法。 Kangax在這方面有一篇很棒的文章:http://perfectionkills.com/whats-wrong-with-extending-the-dom/。然而,DOM原型允許我們在尚不支持它們的環境中實現基於標準的方法,就像ECMAScript第5版方法的墊片一樣。

+0

這確實是一篇很棒的文章。我會檢查出來並報告。 – 2010-11-16 12:04:02

+4

示例原型不隱藏元素。這是切換 – jscripter 2015-07-01 17:40:33

+0

爲什麼只是'HTMLDivElement'爲什麼不添加一個原型到所有的HTML元素? – vsync 2017-06-08 08:47:49

0

這正是prototype.js所做的,但現在被認爲是非常糟糕的做法。 使用包裝器/處理程序要好得多。請注意,增加任何本機對象,尤其是對象,是不好的做法。

讀:

Whats wrong with extending the DOM
Object.prototype is verboten

附錄:

雖然在延長小項目原生對象也算是安全它實際上將成爲一個極壞的習慣中。在用功能和變量拋棄全球範圍的情況下,它只會稍微更壞一點。不僅會發生名稱衝突,還會發生實施衝突。混合起來的庫越多,這種情況就會變得更加激烈。

將您的實現保留在您自己的對象上是避免任何衝突,名稱,實現或其他方式的唯一方法。所有這些說法,你可以隨心所欲地去做,但我不會推薦任何被廣泛接受爲純粹不良做法的東西。我堅持我的建議。

+0

@BGerrissen你能解釋一下prototype.js究竟做了什麼嗎?我對這個圖書館不熟悉。另外,你能否詳細說明使用包裝器/處理程序 - 你是什麼意思?另外,你說「增加任何nativ對象,特別是Object對象」 - 但我不是擴充它,而是它的原型對象。 – 2010-11-16 12:01:18

+6

推薦增加任何本地對象是恐懼mongering,國際海事組織。 * String.prototype *擴展是非常有用的,例如,唯一的潛在缺點是命名未來的衝突。 – 2010-11-16 12:06:30

+0

a)這是面向對象的本質,b)JS完全是面向對象的。從什麼時候「現在」? – 2010-11-16 12:11:24

3

在一些瀏覽器中,DOM元素確實暴露了一個原型對象,該對象也可能繼承自Object.prototype,但這不是普遍正確的(例如,IE不)。一般來說,DOM元素等主機對象不一定要這樣做;事實上,宿主對象並不受適用於本地JavaScript對象的許多規則的束縛,所以你不應該依賴DOM元素來支持這種事情。我們推薦kangax's excellent article on this subject

+0

@Tim我問這個問題,因爲我想讓你的選擇功能更方便。例如,如果我可以將一個'selec'對象添加到HTML元素節點,那麼我可以使用如下的函數:'input.selec.get(); input.selec.set(5,8);' – 2010-11-16 12:08:50

+1

@Šime:啊,對。如果你使用jQuery,你可以像插件那樣通過增加'$ .fn'來做類似的事情。否則,在沒有某種元素包裝對象(如jQuery)的情況下,這是不可能的。 – 2010-11-16 12:13:43

+0

對我們來說幸運的是,IE終於朝着正確的方向前進 - IE 9的DOM對象繼承自Object.prototype。目前,Šime包裝幾乎肯定是最好的選擇。 – 2010-11-16 12:18:57

相關問題