2011-04-07 16 views
15

Felix's Node.js Style Guide में यह कहते हैं:जावास्क्रिप्ट में प्रोटोटाइप खराब हैं?

किसी भी वस्तुओं के प्रोटोटाइप, विशेष रूप से देशी लोगों का विस्तार करें। वहां नरक में एक विशेष स्थान है यदि आप इस नियम का पालन नहीं करते हैं तो आप प्रतीक्षा कर सकते हैं।

This article ने मुझे प्रोटोटाइप के उपयोग पर भी सवाल उठाया। यदि आप बाद में कोड में कोई विधि जोड़ने जा रहे हैं, तो इसे मूल कन्स्ट्रक्टर में क्यों न जोड़ें?

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

उत्तर

33

नहीं, प्रोटोटाइप खराब नहीं हैं। काफी विपरीत, जावास्क्रिप्ट एक प्रोटोटाइप भाषा है और प्रोटोटाइप आप ऑब्जेक्ट्स का विस्तार करने के लिए पर हैं।

उद्धरण Object.prototype विशेष रूप से विस्तारित करने के खिलाफ है। नहीं "एक वस्तु का प्रोटोटाइप"। सब कुछ जावास्क्रिप्ट में Object से विरासत में मिला है, इसलिए इसके प्रोटोटाइप प्रभाव से सबकुछ खराब हो रहा है। यह for(var n in obj){ लूप तोड़ता है और केवल परेशान है।

प्रोटोटाइप के खिलाफ यह एकमात्र चीज है - वे इन-इन लूप में दिखाई देते हैं। इसके अलावा, वे हैं, एफएआर, जेएस में वस्तुओं का विस्तार करने का सबसे अच्छा प्रदर्शन तरीका।

क्यों के लिए के रूप में - निर्माता में वस्तुओं जोड़ना, कहते हैं:

function myClass(){ 
    this.someMethod = function(){ ... } 
} 

मतलब है कि आप वर्ग के प्रत्येक उदाहरण के अलग समारोह होगा। प्रोटोटाइप के माध्यम से इसे करना:

myClass.prototype.someMethod = function(){ ... } 

का अर्थ है कि उस समारोह की केवल एक ही प्रति होगी। अधिक मेमोरी कुशल है, और भाषा के गर्म संपादन के लिए अनुमति देता है।

String.prototype.trim = function(){ ... } 

अगर तुम सिर्फ कहा कि निर्माता किसी भी तरह के लिए, मौजूदा तार .trim() विधि नहीं होती है, तो कोड: navigator.userAgent.trim() काम नहीं है, क्योंकि navigator.userAgent था मान लीजिए कि आप String.prototype संपादित करने के लिए, उदाहरण के लिए चाहते हैं आपके trim() विधि को जोड़ने से पहले परिभाषित किया गया है।

और वह लेख सिर्फ टिम गुदा और पागल है। यह ध्यान न दें :) जब तक आप भूल नहीं है के रूप में टाइप करने के लिए सिर्फ myClass() के बजाय new myClass(), आपको कोई समस्या है नहीं होगा।

+0

आह, धन्यवाद एक भयानक विवरण के लिए गुच्छा। उसने मेरे कई सवालों का जवाब दिया। –

+0

वह अच्छा जवाब था! – some

+0

myClass() का उपयोग करके आपके पहले उदाहरण में, आपने कहा कि यह प्रत्येक उदाहरण के लिए एक नया फ़ंक्शन बनाता है। क्या यह अभी भी लागू होता है अगर इस.someMethod का उपयोग करने के बजाय, मैंने वापसी {someMethod: function() {}} –

2

किसी भी वस्तुओं के प्रोटोटाइप, विशेष रूप से देशी लोगों का विस्तार करें।

जब आप मूल वस्तुओं का विस्तार करते हैं, उदाहरण के लिए स्ट्रिंग जो समस्या हो सकती है क्योंकि उपयोगकर्ता उस ऑब्जेक्ट से कुछ व्यवहार की अपेक्षा कर रहे हैं, लेकिन अलग-अलग परिणाम प्राप्त कर रहे हैं। वे इस डिबगिंग एक कठिन समय हो सकता है ..

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