2008-10-09 5 views
207

जावास्क्रिप्ट के साथ प्रमुख लाभों में से एक कहा जाता है कि यह एक प्रोटोटाइप आधारित भाषा है।इसका क्या अर्थ है कि जावास्क्रिप्ट एक प्रोटोटाइप आधारित भाषा है?

लेकिन इसका क्या अर्थ है कि जावास्क्रिप्ट प्रोटोटाइप आधारित है, और यह एक लाभ क्यों है?

+2

यह उत्तर प्रोटोटाइप विरासत के बारे में जानने के लिए आपको जो कुछ भी जानने की आवश्यकता है, उसे समझाता है: http://stackoverflow.com/a/16872315/783743 –

उत्तर

241

प्रोटोटाइप विरासत ऑब्जेक्ट उन्मुख कोड पुन: उपयोग का एक रूप है। प्रोटोटाइप विरासत का उपयोग करने के लिए जावास्क्रिप्ट एकमात्र [मुख्यधारा] ऑब्जेक्ट-उन्मुख भाषाओं में से एक है। लगभग सभी अन्य ऑब्जेक्ट उन्मुख भाषाएं शास्त्रीय हैं।

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

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

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

लाभ

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

Sidenote:@Andrew हेजेज एक अच्छा बिंदु बनाता है, वहाँ वास्तव में many मूलरूप भाषाओं रहे हैं। यह ध्यान देने योग्य है कि ये अन्य मौजूद हैं, लेकिन यह भी ध्यान देने योग्य है कि उनमें से कोई भी मुख्यधारा के करीब कुछ भी नहीं है। न्यूटनस्क्रिप्ट को थोड़ी देर के लिए कुछ कर्षण लग रहा था, लेकिन इसके मंच के साथ मृत्यु हो गई। कुछ आधुनिक भाषाओं को उन तरीकों से विस्तारित करना भी संभव है जो प्रोटोटाइप क्षमताओं को जोड़ते हैं।

+6

अरे केली। जबकि जावास्क्रिप्ट ** ** अब तक की सबसे लोकप्रिय प्रोटोटाइप भाषा है, वहां कई अन्य हैं: http://en.wikipedia.org/wiki/Prototype-based_programming#Languages ​​ –

+1

हे एंड्रयू। अच्छी बात। मुझे और अधिक स्पष्ट होना चाहिए था। मैं इसका एक नोट बनाउंगा। – keparo

+3

कृपया इसे एक महान उत्तर के लिए https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model – pramodc84

4

कक्षा संरचना घोषित करने के बजाय, आप उसी प्रकार की वस्तुओं को बना सकते हैं, और जब भी आप ऑब्जेक्ट के प्रोटोटाइप का उपयोग करना पसंद करते हैं तो उनकी परिभाषा में जोड़ सकते हैं। यह चीजों को करने के सामान्य तरीके से अधिक लचीला है।

45

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

+5

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

27

प्रोटोटाइप-आधारित प्रोग्रामिंग ऑब्जेक्ट उन्मुख प्रोग्रामिंग की एक शैली है जहां कक्षाएं मौजूद नहीं हैं, और व्यवहार पुन: उपयोग (या कक्षा-आधारित भाषाओं में विरासत) प्रोटोटाइप के रूप में कार्य करने वाली मौजूदा वस्तुओं को क्लोन करके किया जाता है।

+0

क्या आप अभी भी इस तरह महसूस करते हैं? क्योंकि यदि ऐसा है तो यह वास्तव में मेरे साथ वास्तव में केवल "क्लिक" करने का पहला स्पष्टीकरण है। – Chazt3n

9

लाभ/हानि यह है कि, हम कक्षाओं (स्थिर कोड) को परिभाषित करने के बिना रन टाइम पर नई प्रकार की वस्तुओं को बना सकते हैं। अधिकांश सुविधाओं की तरह यह डेवलपर तक एक लाभ/नुकसान के लिए इसे चालू करने के लिए है।

ऊपर संभव है क्योंकि वस्तुएं जावा स्क्रिप्ट (बंद भी) में अनिवार्य रूप से कार्य करती हैं।

+0

डायनामिक ऑब्जेक्ट्स जावास्क्रिप्ट का लाभ हैं, लेकिन वे जावास्क्रिप्ट से प्रोटोटाइप या कार्यात्मक भाषा होने से वास्तव में संबंधित नहीं हैं। कई शास्त्रीय भाषाओं में आप रनटाइम पर गतिशील वस्तुओं को बना सकते हैं। क्लोजर कुछ हद तक असंबंधित हैं। – keparo

+2

कक्षाएं एक स्थैतिक कोड नहीं हैं - पाइथन पर एक नज़र डालें, जिसमें कक्षाएं स्वयं वस्तुएं हैं, और मेटाक्लास से निर्मित हैं जो वस्तुएं भी हैं। –

3

यदि आप नई वस्तुओं के निर्माण के लिए संकलन में कक्षा के बजाय रनटाइम पर ऑब्जेक्ट्स का उपयोग करते हैं, तो इससे किसी वस्तु को विस्तारित किए बिना किसी वस्तु को विस्तारित करने की संभावना खुलती है। बेशक, यह उपयोग के आधार पर बहुत जल्दी एक नुकसान हो सकता है। मैं यहां भाषा के बारे में कोई धारणा नहीं करता हूं, इसलिए यह जावास्क्रिप्ट के अलावा अन्य भाषाओं पर लागू होता है जो गतिशील नहीं हैं।

myobject.prototype=unkownobject; 
myobject.newproperty=1; 

आप ऑब्जेक्ट को लगभग कहीं से भी प्राप्त कर सकते हैं; अपने स्वयं के कोड, नेटवर्क से, डेटाबेस से, बाहरी संबंध से और इसी तरह से।

ध्यान दें कि, एक भाषा को जावास्क्रिप्ट जैसे प्रोटोटाइप विरासत को लागू करने की आवश्यकता नहीं है। जावास्क्रिप्ट में, प्रोटोटाइप ऑब्जेक्ट केवल साझा किया जाता है, इसलिए इसके गुण, विरासतकर्ताओं के बीच भी हैं। विकल्प प्रोटोटाइप के सभी गुणों को नई ऑब्जेक्ट पर कॉपी कर रहा है। प्रत्येक दृष्टिकोण में विभिन्न स्थितियों में इसकी ताकत होती है। मुझे दूसरा और पसंद है लेकिन यह जावास्क्रिप्ट नहीं करता है।

3

सभी जवाब पढ़ने के बाद इस निष्कर्ष

1) विरासत है, जिसमें वस्तुओं अन्य वस्तुओं

2 से सीधे विरासत में मिला रहे) यही कारण है कि कक्षाओं

3 का उपयोग नहीं करता) यह भी उदाहरण बुलाया आधारित है प्रोग्रामिंग या वर्गीकृत प्रोटोटाइप उन्मुख प्रोग्रामिंग

4) व्यवहार पुन: उपयोग मौजूदा वस्तुओं को क्लोन करके किया जाता है जो प्रोटोटाइप

के रूप में कार्य करता है

5) नई वस्तु से टेम्पलेट के रूप में इस्तेमाल वस्तु प्रारंभिक गुण

0

JavaScript is a prototype-based programming language मिल (शायद प्रोटोटाइप आधारित पटकथा भाषा अधिक सही परिभाषा है)। यह क्लोनिंग और विरासत नहीं नियोजित करता है। एक प्रोटोटाइप-आधारित प्रोग्रामिंग भाषा ऑब्जेक्ट उन्मुख प्रोग्रामिंग की एक शैली है जो कक्षाओं के लिए कन्स्ट्रक्टर के रूप में कार्यों का उपयोग करती है। हालांकि जावास्क्रिप्ट में एक कीवर्ड क्लास है, लेकिन इसमें कोई क्लास स्टेटमेंट नहीं है। अन्य ओओपी भाषाओं में जावास्क्रिप्ट की तुलना करते समय यह भेद महत्वपूर्ण है।

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