2009-04-23 27 views
22

जावास्क्रिप्ट में, आप अपने प्रोटोटाइप वस्तु का उपयोग करके मौजूदा कक्षाओं का विस्तार कर सकते हैं:जावास्क्रिप्ट में, क्या आप डोम का विस्तार कर सकते हैं?

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

यह डोम तत्वों का विस्तार करने के लिए इस विधि का उपयोग करने के लिए संभव है?

+6

आप कर सकते हैं। लेकिन शायद नहीं होना चाहिए :) http://perfectionkills.com/whats-wrong-with-extending-the-dom/ – kangax

+1

दरअसल, पिछले तीन वर्षों में चीजें बदल गई हैं: https://github.com/nbubna/mind -कैकिंग/ब्लॉब/gh-pages/extending-the-dom.md –

उत्तर

20

आप तत्व के प्रोटोटाइप का उपयोग करके डोम विस्तार कर सकते हैं। हालांकि, यह आईई 7 और इससे पहले में काम नहीं करता है। आपको एक समय में विशिष्ट तत्व का विस्तार करने की आवश्यकता होगी। प्रोटोटाइप लाइब्रेरी यह करता है। मैं यह देखने के लिए source के माध्यम से देखने की अनुशंसा करता हूं कि यह कैसा हुआ।

+0

ध्यान दें कि यह केवल आईई 6 और आईई 7 के लिए आवश्यक होना चाहिए, क्योंकि आईई 8 इसका समर्थन करता है। Http://msdn.microsoft.com/en-us/library/dd282900(VS.85).aspx देखें। –

+0

आह - स्वाभाविक रूप से मैंने केवल टिप के लिए एफएफएक्स धन्यवाद पर परीक्षण किया। – nickf

+0

हाँ, IE8 डोम हेरफेर के साथ महान महत्त्वपूर्ण प्रगति की है, लेकिन पूरी तरह से अभी मेरी प्राथमिकता सूची के ऊपर काफी नहीं है समर्थन – geowa4

18

मुझे जवाब मिला जैसे मैं सवाल लिख रहा था, लेकिन सोचा कि मैं जानकारी साझा करने के लिए वैसे भी पोस्ट करूंगा।

जिस वस्तु को आप विस्तारित करने की आवश्यकता है वह Element.prototype है।

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

हाँ आप कर सकते हैं, लेकिन यह दृढ़ता से सलाह नहीं दी जाती है।

यदि आप किसी अन्य लाइब्रेरी को ओवरराइड करते हैं तो मूल या अन्य लाइब्रेरी की अपेक्षा की जा रही है जिसे आप उम्मीद कर रहे थे .. अराजकता!

अपने कोड को अपने नामस्थान/दायरे में रखने का सबसे अच्छा अभ्यास है।

7

आपको कुछ भी नहीं ("कुछ भी" जिसका अर्थ है मूल डोम ऑब्जेक्ट्स) - जो केवल खराब चीजों का कारण बनता है। इसके अलावा प्रत्येक नए तत्व को फिर से विस्तारित करना (आपको आईई का समर्थन करने के लिए कुछ करना होगा) अतिरिक्त ओवरहेड जोड़ता है।

क्यों 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 को विस्तारित करने का कोई कारण नहीं है; अन्य डिफ़ॉल्ट ऑब्जेक्ट्स के लिए, बहुत अच्छे हो सकते हैं (डेट.प्रोटोटाइप में स्वरूपण विधियों को जोड़ना, या RegExp.prototype से बचना) देखें। जब वे उपलब्ध और उपयोगी होते हैं तो पूरी तरह से उपयोगी ओओ प्रथाओं से गुजरना मूर्खतापूर्ण है। – eyelidlessness

+1

हम जावास्क्रिप्ट भाषा और डिज़ाइन पैटर्न या उसके जैसा कुछ भी नहीं बोल रहे हैं। यह डोम के बारे में है - मूल डीओएम वस्तुओं का विस्तार करना एक अच्छा विचार नहीं है; तथ्य यह है कि यह सभी ब्राउज़रों में ठीक से काम नहीं करता है उल्लेख करने के लिए नहीं ... – James

+4

अलावा अंतर से, यह क्यों नहीं एक अच्छा विचार है? – eyelidlessness

संबंधित मुद्दे

 संबंधित मुद्दे