2010-11-16 10 views
8

मैं हर वस्तु के लिए नए तरीकों को जोड़ने के बारे में पता है - वस्तु के प्रोटोटाइप बढ़ाने द्वारा:डीओएम तत्व नोड्स के प्रोटोटाइप को बढ़ाना?

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

लेकिन, यह डोम तत्व नोड्स के लिए ही नए तरीकों को परिभाषित करना संभव है? क्या डोम तत्व नोड ऑब्जेक्ट्स में प्रोटोटाइप है? या क्या सामान्य रूप से डोम नोड्स के लिए प्रोटोटाइप हो सकता है?

या प्रोटोटाइप ऑब्जेक्ट केवल अंतर्निहित वस्तुओं के लिए मौजूद हैं?

उत्तर

20

हाँ, लेकिन सभी ब्राउज़रों में नहीं। इंटरनेट एक्सप्लोरर 8 फ़ायरफ़ॉक्स, क्रोम, ओपेरा और सफारी के रूप में, डोम प्रोटोटाइप (कुछ हद तक) का समर्थन करता है।

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

कई लोग अपने प्रोटोटाइप के माध्यम से डोम ऑब्जेक्ट्स को विस्तारित करने के लिए खराब अभ्यास मानते हैं। कंगैक्स इस विषय पर एक महान लेख है: http://perfectionkills.com/whats-wrong-with-extending-the-dom/। हालांकि, डीओएम प्रोटोटाइप हमें उन वातावरणों में मानक-आधारित विधियों को लागू करने की अनुमति देता है जो अभी तक उनका समर्थन नहीं करते हैं, ईसीएमएस्क्रिप्ट 5 वें संस्करण विधियों के लिए शिम की तरह।

+0

वह वास्तव में एक महान लेख है। मैं इसे देख लूंगा और रिपोर्ट करूंगा। –

+4

उदाहरण प्रोटोटाइप तत्व को छुपाता नहीं है। यह टॉगल – jscripter

+0

क्यों है 'HTMLDivElement' क्यों सभी HTML तत्वों के लिए प्रोटोटाइप नहीं जोड़ रहा है? – vsync

0

यह वही है जो prototype.js करता है, लेकिन अब इसे बेहद खराब अभ्यास माना जाता है। रैपर/हैंडलर का उपयोग करना बेहतर है। नोट, किसी भी देशी वस्तुओं को बढ़ाने, विशेष रूप से Object ऑब्जेक्ट, खराब अभ्यास है।

पढ़ने:

Whats wrong with extending the DOM
Object.prototype is verboten

परिशिष्ट:

जबकि छोटी परियोजनाओं में देशी वस्तुओं का विस्तार यह सुरक्षित यह वास्तव में एक बहुत ही बुरा habbit बन जाएगा माना जा सकता है। यह केवल मामूली रूप से कम खराब है, फिर कार्यों और चर के साथ वैश्विक दायरे को कूड़ा कर रहा है। न केवल नाम टकराव होते हैं, बल्कि कार्यान्वयन टकराव भी होते हैं। यह आपके द्वारा मैश किए जाने वाले अधिक पुस्तकालयों को और अधिक अनुकूल बना देगा।

अपने स्वयं के ऑब्जेक्ट्स पर अपना कार्यान्वयन रखना किसी भी टकराव, नाम, कार्यान्वयन या अन्यथा से बचने का एकमात्र तरीका है।

जो कुछ भी कहा गया है, वैसे ही यह करने के लिए आपका अपमानजनक है, हालांकि मैं बहुत खराब अभ्यास के रूप में व्यापक रूप से स्वीकार किए जाने वाले कुछ भी अनुशंसा नहीं करूंगा। मैं अपनी सिफारिश के साथ चिपक जाता हूं।

+0

@BGerrissen क्या आप समझा सकते हैं कि prototype.js क्या करता है? मैं उस पुस्तकालय से अपरिचित हूं। इसके अलावा, क्या आप रैपर/हैंडलर का उपयोग करने पर विस्तार कर सकते हैं - इसका मतलब क्या है? साथ ही, आप कहते हैं "किसी भी नटिव ऑब्जेक्ट्स को बढ़ाने, विशेष रूप से ऑब्जेक्ट ऑब्जेक्ट" - लेकिन मैं इसे बढ़ा नहीं रहा हूं, लेकिन इसकी प्रोटोटाइप ऑब्जेक्ट। –

+6

किसी भी देशी वस्तु को बढ़ाने के खिलाफ सिफारिश डर mongering, आईएमओ है। * String.prototype * एक्सटेंशन बहुत उपयोगी हैं, उदाहरण के लिए, भविष्य में टकराव नामक एकमात्र संभावित नकारात्मक पक्ष के साथ। –

+0

ए) यह ओओपी का सार है, बी) जेएस माध्यमिक रूप से उन्मुख वस्तु है।जब से "अब"? –

3

कुछ ब्राउज़रों में, डोम तत्व प्रोटोटाइप ऑब्जेक्ट का पर्दाफाश करते हैं, जो Object.prototype से भी प्राप्त हो सकता है, लेकिन यह सार्वभौमिक रूप से सत्य नहीं है (उदाहरण के लिए, आईई नहीं करता है)। आम तौर पर, मेजबान ऑब्जेक्ट्स जैसे कि डोम तत्वों को ऐसा करने के लिए बाध्य नहीं किया जाता है; वास्तव में, होस्ट ऑब्जेक्ट्स मूल नियमों के आधार पर लागू होने वाले कई नियमों से बंधे नहीं हैं, इसलिए आपको इस तरह की चीज़ों का समर्थन करने के लिए कभी भी डीओएम तत्वों पर भरोसा नहीं करना चाहिए।

मैं kangax's excellent article on this subject की अनुशंसा करता हूं।

+0

@Tim मैं इस सवाल से पूछ रहा हूं क्योंकि मैं आपके चयन कार्यों को और अधिक सुविधाजनक बनाना चाहता हूं।उदाहरण के लिए, यदि मैं HTML तत्व नोड्स में 'selec' ऑब्जेक्ट जोड़ सकता हूं, तो मैं आपके कार्यों का उपयोग इस प्रकार कर सकता हूं: 'input.selec.get(); input.selec.set (5,8); ' –

+1

@ ime: आह, दाएं। यदि आप jQuery का उपयोग कर रहे हैं तो आप प्लग-इन के रूप में '$ .fn' को बढ़ाकर कुछ ऐसा कर सकते हैं। अन्यथा, आईई में कुछ प्रकार के तत्व रैपर ऑब्जेक्ट (जैसे jQuery की) के बिना यह संभव नहीं है। –

+0

सौभाग्य से हमारे लिए, आईई अंत में सही दिशा में आगे बढ़ रहा है - आईई 9 की डॉम ऑब्जेक्ट्स 'ऑब्जेक्ट.प्रोटोटाइप' से प्राप्त होती है। @ सिम रैपिंग लगभग निश्चित रूप से जाने का रास्ता है। –

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