2011-06-07 17 views
15

हर कोई आम तौर पर सहमत होता है कि प्रोटोटाइप विरासत वर्ग विरासत से सरल और अधिक लचीला है। मैंने जो साहित्य पढ़ा है, उसमें मैंने जो कुछ नहीं देखा है, वह उन चीजों के बहुत से उदाहरण हैं जिन्हें आप प्रोटोटाइप विरासत के साथ कर सकते हैं जिसे आप शास्त्रीय के साथ नहीं कर सकते। तो मुझे एक साधारण सवाल उठता है:प्रोटोटाइप विरासत के साथ आप किस पैटर्न का उपयोग कर सकते हैं जिसे आप कक्षा के साथ नहीं कर सकते?

कुछ पैटर्न क्या हैं जिनका उपयोग आप प्रोटोटाइप विरासत के साथ कर सकते हैं, जिसे आप कक्षा विरासत के साथ नहीं कर सकते हैं और आप इसका उपयोग कब करेंगे/जब तक मार्गदर्शन करेंगे?

+0

यह शायद प्रोग्रामर.स्टैक एक्सचेंज में ले जाया जाना चाहिए। –

+1

@ पॉल: क्यों? यह एक व्यापार मार्गदर्शन/सर्वोत्तम अभ्यास प्रश्न, अधिक सैद्धांतिक नहीं है। कम से कम, मैंने इसे पढ़ा है। –

+0

क्या प्रोग्रामर के बारे में नहीं है? तो मदद के बारे में है, प्रोग्रामर सैद्धांतिक सामान (अन्य चीजों के साथ) के बारे में है। –

उत्तर

1

ठीक है, मैं एक जोड़ने के लिए, तथ्य यह है कि प्रोटोटाइप लिंक वस्तुओं की एक पूरी कक्षा के लिए बंदर-पैच तरीकों को प्रदर्शित कर दिया जाता का उपयोग करेंगे: यदि आप वस्तुओं है कि अचानक जरूरत है

var Cat = function(catName) { 
    this.catName = catName; 
}; 
Cat.prototype.meow = function() { 
    console.log(this.catName+" says meow"); 
} 
var mittens = new Cat("Mittens"); 
var whiskers = new Cat("Whiskers"); 
mittens.meow(); // "Mittens says meow" 
whiskers.meow(); // "Whiskers says meow" 

// All cats are now angry 
Cat.prototype.meow = function() { 
    console.log(this.catName+" says hissssss"); 
} 
mittens.meow(); // "Mittens says hissssss" 
whiskers.meow(); // "Whiskers says hissssss" 

यह उपयोगी होगा कुछ वैश्विक घटनाओं के जवाब में एक पूरी तरह से अलग लेकिन लगातार तरीके से अभिनय शुरू करने के लिए। हो सकता है कि कुछ के लिए:

  • विषय-वस्तु और
  • एक पेज "ऑनलाइन मोड" या "ऑफलाइन मोड" में कार्य कर रहा है या नहीं skinning (जबकि ऑनलाइन सभी प्रश्नों जमा हो जाती है/ajax के माध्यम से लिया गया है, जबकि ऑफ़लाइन प्रश्नों ब्राउज़र को अनुप्रेषित भंडारण)
+1

मैं केवल अज्ञानता से पूछ रहा हूं, लेकिन क्या आपको यह लाभ नहीं मिलता है क्योंकि परिभाषा रनटाइम पर देखी जाती है? मेरा मतलब है, आप क्लास विरासत के साथ ऐसा कर सकते हैं यदि आप रनटाइम पर विधि की परिभाषा को देख/बदल सकते हैं, है ना? –

+1

हाँ, प्रोटोटाइप की तुलना में गतिशील भाषाओं के साथ इसका बहुत कुछ करना है। पाइथन, रूबी, स्मॉलटॉक, और अन्य उपर्युक्त सभी कर सकते हैं। – Jordan

+0

@Esteban: सही। जावा और अधिकांश पुरानी ओओ भाषाएं उस समय से आती हैं जब लुकअप महंगा था, इसलिए प्रकार अपरिवर्तनीय हैं। अधिकांश आधुनिक स्क्रिप्टिंग भाषाओं में गतिशील प्रकार होते हैं। जावास्क्रिप्ट और पायथन भी उदाहरणों के तरीकों को जोड़ने की अनुमति देते हैं, इसलिए प्रत्येक इंस्टेंस को अपनी विधियां मिलती हैं। –

0

चूंकि जावास्क्रिप्ट में कोई वास्तविक वर्ग विरासत नहीं है, इसलिए संभवतः आप कभी भी कोई साहित्य नहीं समझाएंगे कि आप जावास्क्रिप्ट में क्लासिक क्लास विरासत के साथ क्या नहीं कर सकते हैं, जब तक कि आप इसे अन्य भाषाओं में कक्षा विरासत से तुलना न करें।

तो मैं अपने प्रश्न के रूप में यदि आप का मतलब है पर विचार करेंगे:

क्या कुछ पैटर्न है कि आप जावास्क्रिप्ट प्रोटोटाइप विरासत है कि आप भाषाओं इसका समर्थन में वर्ग विरासत के साथ ऐसा नहीं कर सकते के साथ उपयोग कर सकते हैं कर रहे हैं?

आर = सामान्य, सबसे वस्तु उन्मुख भाषाओं कि कक्षा विरासत में आधारित हैं वस्तुओं एक कठोर संरचना है कि उत्पादन में, वे हमेशा अपने जीवन के दौरान एक ही तरीके और गुण और एक ही वर्ग के सभी वस्तुओं होगा होगा एक ही संरचना है।

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

  • जोड़ें या करने के तरीकों या गुण को दूर ऑब्जेक्ट्स, फ्लाई पर

* यह जावास्क्रिप्ट में क्रॉस डोमेन सहयोगी प्रकृति के गतिशील होने के कारण बहुत अच्छी तरह से समर्थित है। कभी-कभी आपको अन्य वेबसाइटों से बाहरी स्क्रिप्ट लोड करने की आवश्यकता होती है लेकिन इन बाहरी पुस्तकालयों से स्रोत कोड बदलने में सक्षम होने के बिना नई कार्यक्षमताओं को जोड़ने की आवश्यकता होती है।

+0

इसके बारे में सोचने के लिए आओ, क्या ऐसी कोई भाषाएं हैं जिनके लिए * दोनों प्रकार की विरासत के लिए अच्छा समर्थन है? – MatrixFrog

+1

हां। कम से कम PHP चलो आप इसे [overloading] (http://php.net/manual/en/language.oop5.overloading.php) नामक तकनीक के साथ करते हैं। बेशक PHP जावास्क्रिप्ट के रूप में गतिशील नहीं है, लेकिन यह वर्ग विरासत भाषा का वास्तविक दुनिया उदाहरण है जिसमें आपको कुछ प्रकार के व्यवहार के साथ प्रोटोटाइप भाषा में सामना करना पड़ता है। – marcio

2

एक अंतर (शायद कम से कम अवधारणात्मक) यह है कि वर्ग विरासत का अर्थ है कि बच्चे आईएस-ए माता-पिता का प्रकार है। प्रोटोटाइप विरासत ऐसा कोई प्रभाव नहीं बनाता है; एक स्तनधारी बिल्ली के लिए एक प्रोटोटाइप है (मरियम-वेबस्टर परिभाषा का कहना है कि इसका मतलब है कि यह "पैटर्न" है), लेकिन कुछ भी नहीं। एक बिल्ली मुक्त हटाने के रूप में मुक्त निकालें/जोड़/परिवर्तन व्यवहार है।

+0

दरअसल, यह कहना गलत है कि वर्ग विरासत का अर्थ है "है-ए", मेरा मानना ​​है कि मैंने बॉब मार्टिन द्वारा हेर्डिंग कोड एपिसोड के दौरान पहली बार यह समझाया था। ए स्क्वायर "एक आयत है लेकिन स्क्वायर: आयताकार लिस्कोव प्रतिस्थापन सिद्धांत तोड़ता है क्योंकि ऊंचाई बदलना चौड़ाई बदल जाएगा और यदि आप आयताकार के साथ काम कर रहे हैं तो यह व्यवहार की उम्मीद नहीं है। मेरा मानना ​​है कि मैंने सुना है कि 'इज-ए' शब्दावली 70 के दशक में एआई समुदाय में कुछ परियोजनाओं से आ रही एक लकी रूपक है।http://www.objectmentor.com/resources/articles/lsp.pdf –

0

मुझे नहीं लगता कि मैं आपके आधार पर सहमत हूं, लेकिन प्रोटोटाइप आधारित विरासत का मुख्य लाभ यह है कि यह कक्षा के सभी सदस्यों पर संपत्तियों और विधियों के रनटाइम असाइनमेंट की अनुमति देता है, भले ही उस कक्षा के पहले से ही उदाहरण हैं।

वास्तव में सिद्धांतवादी उन प्रभावों में से कुछ पर क्रिंग करता है। कल्पना करें कि कुछ ऐसा डिबगिंग करें जहां आपको पता नहीं है कि कोड के किस टुकड़े ने आपकी कक्षा संरचना को पूरी तरह से परिभाषित किया है। यह चुनौती से परे है।

लेकिन, मुझे कहेंगे, कि यह उपयोगी सिद्ध हुआ है:

एक बार, जब मैं ActionScript 2 में काम कर रहा था एक ActionScript के अंदर (दिल वालों के लिए नहीं के रूप में यह लगभग एक गैर नियतात्मक भाषा है) 3 कंटेनर इस समस्या का एक अज्ञात दुष्प्रभाव यह है कि यह स्मृति स्तर (मेरी कंपनी के विरासत कोड के लिए आवश्यक कुछ) के विचार को समाप्त करता है। मैं लाइन जोड़ने में सक्षम था: MovieClip.prototype._level0 = _root; और यह समस्या हल हो गई।

मेरे उपर्युक्त तर्क का मुकाबला करने के लिए, तथ्य यह है कि तथ्य के बाद आप सभी उदाहरणों को संशोधित कर सकते हैं, आपको उन स्थितियों में एक निश्चित मात्रा में शक्ति प्रदान करती है जहां आपके पास मूल कोड आधार (उदाहरण की तरह) तक पहुंच नहीं है, लेकिन मुझे इससे कोई बड़ा फायदा नहीं दिखता है।

+0

मुझे लगता है कि आपकी शिकायत मजबूत मेटाप्रोग्रामिंग क्षमताओं के साथ सभी गतिशील भाषाओं की निंदा करती है। रूबी, पायथन, इत्यादि वास्तव में नहीं कह सकते हैं कि मुझे उन्हें डीबग करने में कठिनाई हुई है (या उस मामले के लिए जेएस जब तक एक परीक्षण सूट है) –

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

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