2011-08-19 22 views
8

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

function Dog() { 
    Dog.prototype.bark = function() { 
     alert('woof!'); 
    } 

    this.bark = function() { 
     Dog.prototype.bark(); 
    } 

    this.bark(); 
} 

पहले, मैं तरीकों बिना किसी कारण के निर्माता के अंदर बनाने (विशेषाधिकार प्राप्त सदस्यों के रूप में) के लिए एक प्रशंसक नहीं हूँ। यह हर बार जब एक उदाहरण बनाया जाता है तो कार्यों को बनाने का कारण बनता है। दूसरा, इस कोड स्निपेट में, यह "इस" के बजाय प्रोटोटाइप नाम "कुत्ता" भी कहता है। यह मुझे सुपर उलझन में डाल देता है।

कोई भी जानता है कि इसके बारे में क्या अच्छा है?

धन्यवाद! अनुग्रह

+1

यह बेहद व्यर्थ लगता है। जो मुझे पता है, प्रोटोटाइप ऑब्जेक्ट का उपयोग परिभाषा के बाहर किसी ऑब्जेक्ट के सभी उदाहरणों में गुण जोड़ने के लिए किया जाता है। चूंकि यह परिभाषा में है, यह थोड़ा अनावश्यक है। – mowwwalker

+0

मैं पूरी तरह से आपसे सहमत हूं। यह भी मेरे लिए व्यर्थ लगता है। –

उत्तर

12

यह कई कारणों से बहुत बुरा विचार है। जिनमें से कुछ इस प्रकार हैं:

  1. निर्माता में प्रोटोटाइप के लिए विधियां जोड़ने का कारण होगा प्रोटोटाइप विधि सभी उदाहरणों के लिए प्रतिस्थापित किया जाना, हर बार एक नई डॉग का दृष्टांत।
  2. कॉलिंग Dog.prototype.bark() का अर्थ है कि thisDog.prototype होगा और Dog का आपका उदाहरण नहीं है, जो गंभीर समस्याएं पैदा कर सकता है।
  3. this.bark = function() { Dog.prototype.bark(); } कुछ गंभीर डब्ल्यूटीएफ है। क्योंकि this.bark पहले से ही इस अनावश्यक बनाने वाली प्रोटोटाइप विधि का मूल्यांकन करेगा। और इसे इस तरह बुलाकर वास्तव में प्राकृतिक this मान को नष्ट कर देता है, जैसा कि # 2 में उल्लिखित है। ,

    function Dog() { 
        this.makeSound(); 
    }; 
    
    Dog.prototype.bark = function() { 
        alert('woof'); 
    }; 
    
    Dog.prototype.makeSound = function() { 
        this.bark(); 
    }; 
    

    या वैकल्पिक रूप से प्रोटोटाइप बिल्कुल बिना:

यहाँ है क्या होना चाहिए है

function Dog() { 
    this.bark = function() { 
    alert('woof'); 
    }; 

    this.makeSound = function() { 
    this.bark(); 
    }; 

    this.makeSound(); 
}; 

मैं तुम्हारा के इस स्निपेट पर भरोसा नहीं होता।

+0

# 2: यह वही है भले ही छाल को कन्स्ट्रक्टर के बाहर शुरू किया गया हो - विधि * यह * कॉल द्वारा सेट की गई है। # 3: # 2 के समान (* यह * होगा * Dog.prototype *), लेकिन फ़ंक्शन * इस * का उपयोग नहीं करता है, इसलिए इससे इस मामले में कोई समस्या नहीं आएगी। – RobG

+0

आप 'this.makeSound = function() {} 'क्यों बनायेंगे? यह उदाहरण स्पष्टीकरण के बिना भ्रामक हो सकता है। यह प्रोटोटाइप ऑब्जेक्ट पर सेट नहीं होता है और फ़ंक्शन को 'नए कुत्ते();' के प्रत्येक उदाहरण के लिए स्मृति में डुप्लिकेट किया जाता है। 'Dog.prototype.makeSound = function() {} 'के लिए बेहतर – dman

2

बहुत देर से उत्तर के लिए क्षमा करें, लेकिन यदि आप वास्तव में निर्माता के भीतर प्रोटोटाइप जोड़ सकते हैं और नहीं जब भी एक नया उदाहरण बन जाता है यह निर्मित करना चाहते हैं, आप ऐसा कर सकता है:

function Dog() { 
    if (!Dog.prototype.bark) { 
     Dog.prototype = function() { 
      console.log('woof'); 
     } 
    } 

    this.bark(); 
} 

मैं अभी भी शायद इस विधि का उपयोग नहीं करेंगे, लेकिन मेरे पास कुछ ऐसे उदाहरण हैं जहां तृतीय पक्ष ढांचे (डोडी प्रकार) से निपटने के दौरान यह विधि एक विकल्प थी।

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