2009-04-23 9 views
22

、あなたはそのプロトタイプオブジェクトを使用して、既存のクラスを拡張することができます。Javascriptでは、DOMを拡張できますか? JavaScriptでは

String.prototype.getFirstLetter = function() { 
    return this[0]; 
}; 

それはDOM要素を拡張するために、このメソッドを使用することは可能ですか?

+6

できます。しかしおそらくないはずです:) http://perfectionkills.com/whats-wrong-with-extending-the-dom/ – kangax

+1

実際には、物事は過去3年間で変化しました:https://github.com/nbubna/mind -hacking/blob/gh-pages/extend-the-dom.m.m –

答えて

20

要素のプロトタイプを使用してDOMを拡張できます。しかし、これはIE7以前では機能しません。特定の要素を1つずつ拡張する必要があります。プロトタイプライブラリはこれを行います。どのように完了したかを見るには、sourceを調べることをおすすめします。

+0

これは、IE8がサポートしているので、IE6とIE7にのみ必要であることに注意してください。 http://msdn.microsoft.com/en-us/library/dd282900(VS.85).aspxを参照してください。 –

+0

ああ - 自然に私はFFxでチップのおかげでテストしました。 – nickf

+0

ええ、IE8はDOM操作で大きな進歩を遂げましたが、それを完全にサポートすることは今では私の優先リストにはあまりありません – geowa4

18

私は質問を書いていたときと同じように答えを見つけましたが、とにかく情報を共有するために投稿すると思いました。

拡張する必要があるオブジェクトはElement.prototypeです。

Element.prototype.getMyId = function() { 
    return this.id; 
}; 
1

はい、できますが、強くお勧めします。

何かを上書きすると、別のライブラリが元のものか、別のライブラリが期待していたものが上書きされてしまいます。カオス!

独自の名前空間/スコープにコードを保存することをお勧めします。

7

あなたは何も直接拡張してはいけません(ネイティブDOMオブジェクトを意味する「何か」によって) - それは悪いことにつながります。 IEをサポートするために何か新しい要素を再拡張すると、オーバーヘッドが増えます。

jQueryのアプローチを取り、ラッパー/コンストラクタを作成して、代わりにその延長しないのはなぜ

var myDOM = (function(){ 
    var myDOM = function(elems){ 
      return new MyDOMConstruct(elems); 
     }, 
     MyDOMConstruct = function(elems) { 
      this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems]; 
      return this; 
     }; 
    myDOM.fn = MyDOMConstruct.prototype = { 
     forEach : function(fn) { 
      var elems = this.collection; 
      for (var i = 0, l = elems.length; i < l; i++) { 
       fn(elems[i], i); 
      } 
      return this; 
     }, 
     addStyles : function(styles) { 
      var elems = this.collection; 
      for (var i = 0, l = elems.length; i < l; i++) { 
       for (var prop in styles) { 
        elems[i].style[prop] = styles[prop]; 
       } 
      } 
      return this; 
     } 
    }; 
    return myDOM; 
})(); 

を次にあなたがmyDOM.fnを経由して、独自のメソッドを追加することができます...そして、あなたはこのようにそれを使用することができます:

myDOM(document.getElementsByTagName('*')).forEach(function(elem){ 
    myDOM(elem).addStyles({ 
     color: 'red', 
     backgroundColor : 'blue' 
    }); 
}); 
+11

"何かを直接拡張してはいけません。あなたがそれを行い、あなたのコードを正しく書くための正当な理由があるなら、それは良いことにつながるでしょう。相互運用性の問題以外にも、Element.prototypeを拡張しない理由はありません。他のデフォルトオブジェクトの場合は、多くの良いことがあります(Date.prototypeへの書式設定メソッドの追加、またはRegExp.prototypeへのエスケープ参照)。それらが利用可能で有用であるとき、完全に有用なオブジェクト指向の実践を避けるのは愚かです。 – eyelidlessness

+1

JavaScriptの言語やデザインパターンなどについては言及していません。これは、DOMを拡張するネイティブDOMオブジェクトについてのものではありません。それはすべてのブラウザで正常に動作しないという事実は言うまでもありません... – James

+4

相互運用性は別として、なぜそれは良い考えではありませんか? – eyelidlessness

関連する問題