नहीं, प्रोटोटाइप खराब नहीं हैं। काफी विपरीत, जावास्क्रिप्ट एक प्रोटोटाइप भाषा है और प्रोटोटाइप आप ऑब्जेक्ट्स का विस्तार करने के लिए पर हैं।
उद्धरण 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()
, आपको कोई समस्या है नहीं होगा।
स्रोत
2011-04-07 03:12:09
आह, धन्यवाद एक भयानक विवरण के लिए गुच्छा। उसने मेरे कई सवालों का जवाब दिया। –
वह अच्छा जवाब था! – some
myClass() का उपयोग करके आपके पहले उदाहरण में, आपने कहा कि यह प्रत्येक उदाहरण के लिए एक नया फ़ंक्शन बनाता है। क्या यह अभी भी लागू होता है अगर इस.someMethod का उपयोग करने के बजाय, मैंने वापसी {someMethod: function() {}} –