DOM / बिल्ट-इन ऑब्जेक्ट प्रोटोटाइप को एक बुरे विचार के रूप में क्यों विस्तारित किया जा रहा है?


15

मैं एक निश्चित उत्तर की तलाश कर रहा हूं कि अंतर्निहित प्रोटोटाइप को विस्तारित करना जेएस डेवलपर समुदाय में इतना भारी क्यों है। मैं थोड़ी देर के लिए प्रोटोटाइप जेएस फ्रेमवर्क का उपयोग कर रहा हूं, और मुझे करने की [1,2,3].each(doStuff)तुलना में बहुत अधिक सुरुचिपूर्ण लगता है $.each([1,2,3], doStuff)। मुझे पता है कि यह "नाम स्थान का प्रदूषण" बनाता है, लेकिन मैं यह नहीं समझता कि इसे एक बुरी चीज क्यों माना जाता है। इसके अलावा क्या कोई वास्तविक प्रदर्शन गिरावट अंतर्निहित प्रोटोटाइप के साथ जुड़ा हुआ है? धन्यवाद!


1
एक बात यह है कि for(var ... in ...)लूप्स गड़बड़ हो जाते हैं क्योंकि प्रोटोटाइप फ़ंक्शन भी पास हो जाते हैं।
pimvdb

4
"भारी पीछा", वास्तव में ?! अच्छा भगवान, आदमी:] क्या तुम ठीक हो?
पिक्सेलबॉय

जवाबों:


12

मेरा सुझाव है कि आप इस लेख को पढ़ें जो मुझे लगता है कि बहुत अच्छी तरह से समझाता है कि क्यों वस्तुओं का विस्तार करना एक बुरा विचार है, प्रोटोटाइप के संबंध में भी।

संक्षेप में:

विनिर्देशन का अभाव

"प्रोटोटाइप ऑब्जेक्ट्स" का एक्सपोजर किसी भी विनिर्देश का हिस्सा नहीं है। [...] पूरी तरह से DOM स्तर 2 के अनुरूप कार्यान्वयन के लिए, उन वैश्विक नोड, तत्व, HTMLElement, आदि वस्तुओं को उजागर करने की कोई आवश्यकता नहीं है।

मेजबान वस्तुओं का कोई नियम नहीं है

DOM ऑब्जेक्ट्स होस्ट ऑब्जेक्ट्स हैं [...] होस्ट ऑब्जेक्ट्स इन आंतरिक तरीकों को किसी भी कार्यान्वयन-निर्भर व्यवहार के साथ लागू कर सकते हैं, या यह हो सकता है कि एक होस्ट ऑब्जेक्ट केवल कुछ आंतरिक तरीकों को लागू करता है और दूसरों को नहीं।

[...] आंतरिक तरीकों का व्यवहार कार्यान्वयन-निर्भर है। [...] परिभाषा के अनुसार, आप किसी ऐसी चीज के साथ काम कर रहे हैं जिसे अप्रत्याशित और पूरी तरह से अनिश्चित तरीके से व्यवहार करने की अनुमति है।

टकराव की संभावना

आज उपयोग में भारी मात्रा में वातावरण को देखते हुए, यह बताना असंभव हो जाता है कि क्या कुछ संपत्ति पहले से ही कुछ डोम का हिस्सा नहीं है। [...]

प्रत्येक नामित प्रपत्र नियंत्रण छाया गुण प्रोटोटाइप श्रृंखला के माध्यम से विरासत में मिला है। प्रपत्र तत्वों पर टकराव और अप्रत्याशित त्रुटियों की संभावना और भी अधिक है।

किसी प्रकार की उपसर्ग रणनीति तैयार करने से समस्या दूर हो सकती है। लेकिन शायद अतिरिक्त शोर भी लाएगा।

ओवरहेड प्रदर्शन

[...] ऐसे ब्राउज़र जो तत्व एक्सटेंशन का समर्थन नहीं करते हैं - जैसे IE 6, 7, Safari 2.x, आदि - को मैनुअल ऑब्जेक्ट एक्सटेंशन की आवश्यकता होती है। समस्या यह है कि मैनुअल एक्सटेंशन धीमा, असुविधाजनक है और इसका कोई पैमाना नहीं है।

[...] एक बार जब आप तत्वों को विस्तारित करना शुरू करते हैं, तो लाइब्रेरी एपीआई को सबसे अधिक हर जगह विस्तारित तत्वों को वापस करने की आवश्यकता होती है। परिणामस्वरूप, $ $ जैसी क्वेरी पद्धति हर एक तत्व को एक क्वेरी में विस्तारित कर सकती है।

आईई डोम एक गड़बड़ है

जैसा कि पिछले भाग में दिखाया गया है, मैन्युअल DOM एक्सटेंशन एक गड़बड़ है। लेकिन IE में मैनुअल डोम एक्सटेंशन और भी बदतर है [...]

बोनस: ब्राउज़र बग


9

एक अन्य कारण कोड पठनीयता / स्थिरता है। यदि कोई अन्य डेवलपर (विशेष रूप से एक नौसिखिया) मेरा कोड पढ़ रहा है और देखता है [0, 1, 2].foo(...), तो वे यह नहीं जान सकते हैं कि फू विधि क्या है या इसके लिए प्रलेखन / स्रोत कहां मिलेगा। क्या फू प्रोटोट.जेएस, या उपयोग में किसी अन्य पुस्तकालय द्वारा, या किसी अन्य फ़ाइल में मेरे कोड के कुछ अन्य भाग द्वारा जोड़े गए भाषा का विस्तार है, या यह एक देशी जावास्क्रिप्ट विधि है जिसके बारे में उन्हें पता नहीं था? उन्हें इसके लिए शिकार करने की आवश्यकता है और इसे तुरंत नहीं मिल सकता है (या यदि संघर्ष हैं तो वे सही नहीं मिल सकते हैं)।

JQuery के दृष्टिकोण के साथ, यदि आप देखते हैं $.foo(...), तो foo विधि का नाम स्थान यह स्पष्ट करता है कि इसकी परिभाषा / प्रलेखन कहां पाया जाए यदि आप नहीं जानते कि यह क्या करता है।


पाठकों के लिए विधियाँ कहाँ से आती हैं, इसकी खोज करना बहुत महत्वपूर्ण है। हालाँकि मुझे नहीं लगता कि jQuery एक अच्छा उदाहरण है क्योंकि जब आप वेब कोड पढ़ने में कूदते हैं तो डॉलर-साइन चुनौतीपूर्ण होता है और पहले से ही यह नहीं जानते कि वह क्या है।
साइमन फेल्टमैन

4

यहाँ मूल मुद्दा है: क्या होगा यदि आपके पास दो उपकरण हैं जो प्रोटोटाइप को असंगत तरीकों से बढ़ाते हैं, या जो आमतौर पर तरीकों को बढ़ाते हैं जैसे कि वे अलग-अलग परिणाम देते हैं (यह for...inजावास्क्रिप्ट में एक विशेष मुद्दा है ), इस प्रकार कोड जो निर्भर करता है तोड़ने के लिए उनके सामान्य व्यवहार पर?

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

निश्चित रूप से प्रोटोटाइप.जेएस बहुत अच्छी तरह से जाना जाता है और अधिकांश उपकरण इसके चारों ओर काम करते हैं। इसी तरह, मुझे यकीन है कि ऐसे मामले हैं जहां आधार प्रोटोटाइप का विस्तार करना सही बात है। लेकिन, यह सावधानी के साथ संपर्क करने के लिए कुछ है।


1

यकीन नहीं होता कि यह वास्तव में अभी भी एक मुद्दा है, लेकिन इंटरनेट एक्सप्लोरर के पुराने संस्करणों के साथ मेरा अनुभव यह है कि कभी-कभी कुछ बिल्ड-इन प्रकारों का विस्तार करना भी संभव नहीं था।


1

यहां दो अलग-अलग मुद्दे हैं। पहला अंतर्निहित प्रोटोटाइप का सामान्य विस्तार है, और दूसरा विशेष रूप से डोम प्रोटोटाइप का विस्तार है। अंतर्निहित प्रोटोटाइप के विस्तार के खिलाफ तर्क:

  • संभावित झड़पें: अलग-अलग स्रोतों से कोड के दो टुकड़े दोनों एक ही प्रोटोटाइप पर एक ही संपत्ति को परिभाषित करते हैं
  • साइड-इफेक्ट्स: विस्तार करना Array.prototypeया Object.prototypeनॉक-ऑन प्रभाव हो सकते हैं, जैसे कि for...inलूप में बढ़ाई जा रही एक्सटेंशन विधियों को जोड़ना

DOM प्रोटोटाइप का विस्तार करने के लिए, ऊपर दिए गए संभावित क्लैश तर्क अभी भी लागू होते हैं। इसके अतिरिक्त, DOM नोड्स होस्ट ऑब्जेक्ट हैं और जैसे कि देशी जावास्क्रिप्ट ऑब्जेक्ट्स के सामान्य नियमों में से किसी के अधीन नहीं हैं। वे अनिवार्य रूप से वही कर सकते हैं जो उन्हें पसंद है और समझदार प्रोटोटाइप ऑब्जेक्ट प्रदान करने के लिए किसी भी दायित्व के तहत नहीं हैं या यहां तक ​​कि अतिरिक्त ("एक्सपेंडो") संपत्तियों की अनुमति देते हैं। IE विशेष रूप से इस अधिकार का उपयोग करता है, IE 9 से पहले DOM ऑब्जेक्ट के लिए कोई प्रोटोटाइप प्रदान नहीं करता है और विभिन्न DOM ऑब्जेक्ट्स पर गुणों के बारे में विभिन्न अजीबताएं हैं (हालांकि आप आमतौर पर तत्वों को गुण असाइन कर रहे हैं, बशर्ते कुछ भी सेट न document.expandoहो false।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.