इसका क्या मतलब है कि जावास्क्रिप्ट एक प्रोटोटाइप आधारित भाषा है?


255

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

लेकिन इसका क्या मतलब है कि जावास्क्रिप्ट प्रोटोटाइप आधारित है, और यह एक फायदा क्यों है?


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

जवाबों:


291

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

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

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

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

लाभ

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

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


9
हे केली। जबकि जावास्क्रिप्ट अब तक की सबसे लोकप्रिय प्रोटोटाइप भाषा है, वहाँ कई अन्य हैं: en.wikipedia.org/wiki/Prototyp-based_programming#Languages
एंड्रयू हेजेज

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

3
कृपया इसे भी पढ़ें। developer.mozilla.org/en/JavaScript/Guide/…
pramodc84

1
एक महान जवाब के लिए +1। एक मामूली टिप्पणी: मेरे लिए, शास्त्रीय विरासत प्रोटोटाइप से अधिक "प्रत्यक्ष" लगती है। वास्तव में, मैं वास्तव में प्रोटोटाइप ऑब्जेक्ट को मात्र लिंकेज (अन्य ऑब्जेक्ट्स) के रूप में देखता हूं, जबकि संकलित ओओपी में मैं बेस-क्लास को "सीधे विरासत में" मानता हूं। इस प्रकार, प्रोटोटाइप-ऑब्जेक्ट्स को विरासत में मिलाया गया है (विरासत में कुछ हद तक नकली है)। कोई विचार?
कैदी जीरो

3
@PrisonerZERO: मेरा तर्क है कि प्रोटोटाइप विरासत में शास्त्रीय की तुलना में अधिक प्रत्यक्ष है। ऑब्जेक्ट B के बजाय एक वर्ग की ओर इशारा करता है जो उस वर्ग से विरासत में मिलता है जो ऑब्जेक्ट को इंगित करता है, यह सीधे ऑब्जेक्ट A पर इंगित करता है और कहता है "मैं उस ऑब्जेक्ट को पसंद कर रहा हूं, सिवाय ..."। प्रोटोटाइप विरासत के बारे में बड़ी बात, और जो चीज ज्यादातर लोगों को आंतरिक रूप से सबसे कठिन लगती है, वह यह है कि यह प्रकारों से उदाहरणों को अलग नहीं करता है। प्रत्येक वस्तु एक प्रकार और एक उदाहरण दोनों है। दोनों के बीच अंतर कृत्रिम और जानबूझकर है, और आमतौर पर एक वर्ग-उन्मुख मानसिकता में फंसने का एक लक्षण है।
cHao

54

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


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

32

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


क्या आपको अभी भी ऐसा ही लगता है? क्योंकि अगर ऐसा है, तो यह मेरे साथ कभी भी सिर्फ ठोस रूप से "क्लिक" करने का पहला स्पष्टीकरण है।
Chazt3n

11

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

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


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

2
कक्षाएं आवश्यक रूप से एक स्थिर कोड नहीं हैं - पायथन पर एक नज़र डालें, जिसमें कक्षाएं स्वयं ऑब्जेक्ट हैं, और मेटाक्लस से बाहर का निर्माण किया जाता है जो ऑब्जेक्ट भी हैं।
टॉमाज़ ज़िलिओस्की

6

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


6

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

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

आपको वस्तु कहीं से भी प्राप्त हो सकती है; आपका अपना कोड, नेटवर्क से, डेटाबेस से, बाहरी लिंकेज आदि से।

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


6

सभी उत्तरों को पढ़ने के बाद यह निष्कर्ष है

1) वंशानुक्रम जिसमें वस्तुओं को अन्य वस्तुओं से सीधे विरासत में मिला है

2) जो कक्षाओं का उपयोग नहीं करता है

3) उदाहरण आधारित प्रोग्रामिंग या क्लासलेस प्रोटोटाइप ओरिएंटेड प्रोग्रामिंग भी कहा जाता है

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

5) नई वस्तु से टेम्पलेट के रूप में उपयोग की जाने वाली वस्तु को प्रारंभिक गुण मिलते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.