जावास्क्रिप्ट में बहुरूपता क्या है?


91

मैंने कुछ संभावित लेख पढ़े हैं जो मुझे इंटरनेट पर मिल सकते हैं पॉलीमॉर्फिज़्म । लेकिन मुझे लगता है कि मैं इसके अर्थ और इसके महत्व को समझ नहीं पाया। अधिकांश लेख यह नहीं कहते कि यह महत्वपूर्ण क्यों है और मैं OOP (जावास्क्रिप्ट में बेशक) में बहुरूपी व्यवहार कैसे प्राप्त कर सकता हूं।

मैं कोई भी कोड उदाहरण नहीं दे सकता क्योंकि मुझे यह विचार नहीं आया कि इसे कैसे लागू किया जाए, इसलिए मेरे प्रश्न नीचे हैं:

  1. यह क्या है?
  2. हमें इसकी आवश्यकता क्यों है?
  3. यह काम किस प्रकार करता है?
  4. मैं जावास्क्रिप्ट में इस बहुरूपी व्यवहार को कैसे प्राप्त कर सकता हूं?

मुझे इसका उदाहरण मिला है। लेकिन यह आसानी से समझ में आता है कि इस कोड का परिणाम क्या होगा। यह स्वयं बहुरूपता के बारे में कोई स्पष्ट विचार नहीं देता है।

function Person(age, weight) {
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo.";
    }
}
function Employee(age, weight, salary) {
    this.salary = salary;
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo " +
        "and earns " + this.salary + " dollar.";
    }
}

Employee.prototype = new Person();
Employee.prototype.constructor = Employee;
  // The argument, 'obj', can be of any kind
  // which method, getInfo(), to be executed depend on the object
  // that 'obj' refer to.

function showInfo(obj) {
    document.write(obj.getInfo() + "<br>");
}

var person = new Person(50,90);
var employee = new Employee(43,80,50000);
showInfo(person);
showInfo(employee);

यह सवाल शायद स्टैकऑवरफ्लो के साथ काम करने के लिए बहुत व्यापक है। सबसे अच्छा हम यह कर सकते हैं कि आप कुछ अन्य बहुरूपता स्पष्टीकरण से जुड़े। StackOverflow किसी विशिष्ट समस्या के बारे में विशिष्ट प्रश्नों या स्पष्टीकरणों का जवाब देने में सबसे अच्छा है, जैसे "स्रोत ने कहा कि बहुरूपता एक्सवाईजेड था, लेकिन वाई का क्या अर्थ है?"
विट्रुवियस

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

1
बहुरूपता केवल OO से संबंधित नहीं है, और इसके कई अर्थ हैं। आप इन सवालों के तहत यह अन्य उत्तर पढ़ना चाह सकते हैं क्या बहुरूपता बिना वंशानुक्रम के संभव है
एडविन डैलोरेज़ो

विरासत में आमतौर पर जावास्क्रिप्ट में गलत तरीके से किया जाता है। बालकों के प्रोटोटाइप के रूप में उपयोग किए जाने वाले माता-पिता का एक उदाहरण बनाने के लिए, एक वस्तु को परिभाषित करने और बनाने में भूमिका के निर्माण कार्य और प्रोटोटाइप की भूमिका की समझ का अभाव दर्शाता है। अधिक जानकारी इस उत्तर में उपलब्ध है: stackoverflow.com/a/16063711/1641941
HMR

जवाबों:


99

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

OOP में प्रत्येक वस्तु को एक वस्तु के रूप में प्रतिरूपित किया जाता है। इस अमूर्त को एक कार के लिए नट और बोल्ट के नीचे, या एक साल, बनाने, और मॉडल के साथ बस कार के रूप में व्यापक रूप में लिया जा सकता है।

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

लोगों और कर्मचारियों के उदाहरण पर वापस जाना, सभी कर्मचारी लोग हैं, लेकिन सभी लोग कर्मचारी नहीं हैं। जो कहना है कि लोग सुपर क्लास होंगे, और सब क्लास के कर्मचारी होंगे। लोगों की उम्र और वजन हो सकते हैं, लेकिन उनके पास वेतन नहीं है। कर्मचारी वे लोग होते हैं इसलिए उनके पास स्वाभाविक रूप से एक उम्र और वजन होगा, लेकिन यह भी क्योंकि वे कर्मचारी हैं उनका वेतन होगा।

इसलिए इसे सुविधाजनक बनाने के लिए, हम पहले सुपर क्लास (व्यक्ति) को लिखेंगे।

function Person(age,weight){
 this.age = age;
 this.weight = weight;
}

और हम व्यक्ति को उनकी जानकारी साझा करने की क्षमता देंगे

Person.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo.";
};

आगे हम व्यक्ति, कर्मचारी का एक उपवर्ग चाहते हैं

function Employee(age,weight,salary){
 this.age = age;
 this.weight = weight;
 this.salary = salary;
}
Employee.prototype = new Person();

और हम getInfo के व्यवहार को एक कर्मचारी को परिभाषित करने से रोकेंगे जो एक कर्मचारी के लिए अधिक उपयुक्त है

Employee.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo " +
    "and earns " + this.salary + " dollar.";  
};

इनका उपयोग आपके मूल कोड उपयोग के समान किया जा सकता है

var person = new Person(50,90);
var employee = new Employee(43,80,50000);

console.log(person.getInfo());
console.log(employee.getInfo());

हालाँकि, यहाँ वंशानुक्रम का उपयोग करके बहुत कुछ हासिल नहीं किया गया है क्योंकि कर्मचारी का निर्माण व्यक्ति के समान है, और प्रोटोटाइप में एकमात्र फ़ंक्शन ओवरराइड किया जा रहा है। बहुरूपी डिजाइन में शक्ति व्यवहार साझा करने के लिए है।


2
@ user3138436 - यह सही है। प्रोटोटाइप श्रृंखला का निरीक्षण पहली घटना के लिए getInfoकिया जाएगा , जो कर्मचारी की होगी क्योंकि यह कर्मचारी की तुलना में श्रृंखला में अधिक है। जब मैंने कहा कि "ओवरराइड" का यही मतलब था।
ट्रैविस जे

17
आप कंस्ट्रक्टर (Person.call (यह, arg)) का उपयोग नहीं कर रहे हैं और व्यक्ति के एक उदाहरण के लिए कर्मचारी प्रोटोटाइप सेट कर रहे हैं। प्रोटोटाइप वह है जहाँ साझा सदस्य चलते हैं और निर्माण कार्य वह जगह है जहाँ उदाहरण विशिष्ट सदस्य बनाए जाते हैं। आपके नमूने कॉपी पेस्ट कोड का उपयोग करते हैं, निर्माता फ़ंक्शन का पुनः उपयोग करते हैं और प्रोटोटाइप भाग को गलत करते हैं (व्यक्ति के पास विशिष्ट सदस्य हैं जिनका कोई व्यवसाय नहीं है Employee.prototype पर विशेष रूप से यदि आपके पास उत्परिवर्ती सदस्य हैं)। निर्माण कार्यों और प्रोटोटाइप का उपयोग करने के बारे में अधिक जानकारी यहाँ: stackoverflow.com/a/16063711/1641941
HMR

3
कर्मचारी को फिर से उपयोग करने और उस व्यक्ति के getinfo का विस्तार करने के लिए, return Person.prototype.getInfo.call(this) + + "and earns " + this.salary + " dollar.";जो कॉपी पेस्ट कोड पुनः उपयोग के बजाय बस कर सकता है ।
एचएमआर

3
यहाँ जहाँ बहुरूपता लागू होता है?
अल्बर्ट जिगनी

2
@ ओआरजी उदाहरण में बहुरूपता के बिंदु को बेहतर तरीके से देखा जा सकता है। समारोह showInfo (); एक सामान्य वस्तु को स्वीकार करता है। बहुरूपता अब वस्तु प्रकार के आधार पर अलग-अलग प्रतिक्रिया करने की क्षमता है। मुझे लगता है कि यह जवाब पर्याप्त स्पष्ट नहीं करता है, क्योंकि यह हर विशिष्ट वस्तु पर getInfo () कहता है।
स्टीफन

26

जैसा कि इस अन्य उत्तर में बताया गया है , बहुरूपता की अलग-अलग व्याख्याएँ हैं।

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

यह क्या है?

कार्डेली इस लेख में कई प्रकार के बहुरूपता को परिभाषित करता है:

  • यूनिवर्सल
    • पैरामीट्रिक
    • समावेश
  • अनौपचारिक
    • oveloading
    • बलात्कार

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

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

फिर भी, जावास्क्रिप्ट में एक प्रकार की विरासत है, जो उप-प्रकार के बहुरूपता के समान विचारों का अनुकरण करती है (जिसे कार्डेली द्वारा ऊपर शामिल किए जाने वाले बहुरूपता के रूप में वर्गीकृत किया गया है) एक समान तरीके से हम जो आमतौर पर जावा या सी # जैसे अन्य ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में करते हैं (जैसा कि समझाया गया है) एक और जवाब जो मैंने ऊपर साझा किया है)।

बहुआयामी भाषाओं में बहुत सामान्य रूप से बहुरूपता का एक अन्य रूप बतख टाइपिंग कहलाता है

यह मानना ​​गलत है कि बहुरूपता केवल वस्तु-उन्मुख प्रोग्रामिंग से संबंधित है। अन्य प्रोग्रामिंग मॉडल (कार्यात्मक, प्रक्रियात्मक, तर्क आदि) अपने प्रकार के सिस्टम में बहुरूपता के विभिन्न रूपों की पेशकश करते हैं, शायद एक तरह से केवल ओओपी के लिए इस्तेमाल होने वाले लोगों के लिए अपरिचित।

हमें इसकी आवश्यकता क्यों है?

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

यह कैसे काम करता है?

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

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


14

बहुरूपता का उद्देश्य क्या है?

बहुरूपता एक स्थिर प्रकार की प्रणाली को खो देता है (महत्वपूर्ण) स्थिर प्रकार की सुरक्षा को खो देता है (प्रकार) प्रकार तुल्यता के लिए शर्तों को ढीला करके। प्रमाण यह रहता है कि कोई प्रोग्राम केवल तभी चलेगा जब उसमें किसी प्रकार की त्रुटि न हो।

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

यह जावास्क्रिप्ट पर कैसे लागू होता है?

जावास्क्रिप्ट में एक कमजोर, गतिशील प्रकार की प्रणाली है। इस तरह की प्रणाली एक सख्त प्रकार की प्रणाली के बराबर है जिसमें केवल एक प्रकार होता है। हम इस तरह के एक विशाल संघ प्रकार (छद्म वाक्य रचना) के बारे में सोच सकते हैं:

type T =
 | Undefined
 | Null
 | Number
 | String
 | Boolean
 | Symbol
 | Object
 | Array
 | Map
 | ...

प्रत्येक मान रन-टाइम पर इनमें से किसी एक प्रकार के विकल्प से जुड़ा होगा। और जब से जावास्क्रिप्ट कमजोर रूप से टाइप किया गया है, हर मूल्य अपने प्रकार को किसी भी समय बदल सकता है।

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

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

इसे ठीक से करने के लिए मैं आपको बहुरूपता के सबसे आम अभिव्यक्तियों का अवलोकन देने जा रहा हूं।

पैरामीट्रिक बहुरूपता (उर्फ जेनरिक)

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

// parametric polymorphic functions

const id = x => x;

id(1); // 1
id("foo"); // "foo"

const k = x => y => x;
const k_ = x => y => y;

k(1) ("foo"); // 1
k_(1) ("foo"); // "foo"

const append = x => xs => xs.concat([x]);

append(3) ([1, 2]); // [1, 2, 3]
append("c") (["a", "b"]); // ["a", "b", "c"]

तदर्थ बहुरूपता (उर्फ ओवरलोडिंग)

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

Ad-hoc polymorphism एक फ़ंक्शन को बड़े डोमेन के प्रकारों के अनुकूल बनाता है। निम्न उदाहरण "मैप-ओवर" उद्देश्य को दिखाता है और इस बाधा को कैसे लागू कर सकता है। फ़ंक्शन के एक सेट के बजाय "mappable" बाधा में केवल एक mapफ़ंक्शन शामिल होता है:

// Option type
class Option {
  cata(pattern, option) {
    return pattern[option.constructor.name](option.x);
  }
  
  map(f, opt) {
    return this.cata({Some: x => new Some(f(x)), None: () => this}, opt);
  }
};

class Some extends Option {
  constructor(x) {
    super(x);
    this.x = x;
  }
};

class None extends Option {
  constructor() {
    super();
  }
};


// ad-hoc polymorphic function
const map = f => t => t.map(f, t);

// helper/data

const sqr = x => x * x;

const xs = [1, 2, 3];
const x = new Some(5);
const y = new None();

// application

console.log(
  map(sqr) (xs) // [1, 4, 9]
);

console.log(
  map(sqr) (x) // Some {x: 25}
);

console.log(
  map(sqr) (y) // None {}
);

उप-प्रकार बहुरूपता

चूंकि अन्य उत्तर पहले से ही उप-प्रकार के बहुरूपता को कवर करते हैं इसलिए मैं इसे छोड़ देता हूं।

संरचनात्मक बहुरूपता (उर्फ कड़ाई से घटाव)

संरचनात्मक बहुरूपता का कहना है कि विभिन्न प्रकार समान हैं, यदि वे एक ही संरचना को इस तरह से समाहित करते हैं, तो एक प्रकार में दूसरे के सभी गुण होते हैं, लेकिन अतिरिक्त गुण शामिल हो सकते हैं। कहा जा रहा है कि संरचनात्मक बहुरूपता संकलन समय पर टाइपिंग कर रही है और निश्चित रूप से कुछ अतिरिक्त प्रकार की सुरक्षा प्रदान करती है। लेकिन यह दावा करते हुए कि दो मूल्य एक ही प्रकार के हैं क्योंकि वे कुछ गुण साझा करते हैं, यह मूल्यों के अर्थ स्तर को पूरी तरह से अनदेखा करता है:

const weight = {value: 90, foo: true};
const speed =  {value: 90, foo: false, bar: [1, 2, 3]};

दुर्भाग्यवश, speedका एक उपप्रकार माना जाता है weightऔर जैसे ही हम valueगुणों की तुलना करते हैं हम वास्तव में संतरे के साथ सेब की तुलना कर रहे हैं।


1
जबकि यह कई मामलों में स्वीकृत उत्तर की तुलना में अधिक सटीक (और निश्चित रूप से अधिक गहन) है, इसमें समान पहुंच नहीं है: यह उत्तर मानता है कि प्रश्नकर्ता परेशान करने के लिए पहले से ही बहुत स्मार्ट है :)
जेरेड स्मिथ

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

संपादित करने से पहुंच में काफी सुधार होता है। गतिशील भाषाओं में बहुरूपता की उपयोगिता के लिए, बहुत सारे हैं लेकिन मैं जेएस में एक अच्छा उदाहरण सोचने के लिए संघर्ष कर रहा हूं। एक बेहतर उदाहरण पायथन के जादू के तरीके होंगे जो उपयोगकर्ता-परिभाषित प्रकारों को पॉलीमॉर्फिक कार्यों के साथ काम करने की अनुमति देते हैं len। या शायद conjलौंग से।
जेरेड स्मिथ

8

यह क्या है?

पाली = कई, रूपवाद = रूप या व्यवहार शिफ्टिंग।

हमें इसकी आवश्यकता क्यों है?

प्रोग्रामिंग में, इसका उपयोग तब किया जाता है जब हम एक फ़ंक्शन चाहते हैं (फ़ंक्शन X का इंटरफ़ेस कहें) विभिन्न प्रकार या मापदंडों की संख्या को स्वीकार करने के लिए पर्याप्त लचीला होना चाहिए। इसके अलावा, बदलते प्रकार या संख्याओं के आधार पर, हम चाहते हैं कि फ़ंक्शन X अलग तरह से व्यवहार करे (आकारिकी)।

यह काम किस प्रकार करता है?

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

मैं जावास्क्रिप्ट में इस बहुरूपी व्यवहार को कैसे प्राप्त कर सकता हूं?

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


4

बहुरूपता का अर्थ है अलग-अलग वस्तुओं पर एक ही विधि को कॉल करने की क्षमता और प्रत्येक वस्तु का अलग-अलग तरीके से प्रतिक्रिया करना पॉलीमॉर्फम कहा जाता है ।

    function Animal(sound){
    this.sound=sound;
    this.speak=function(){
    			return this.sound;
    	}
    }
//one method 
    function showInfo(obj){
    		console.log(obj.speak());
    }
//different objects
    var dog = new Animal("woof");
    var cat = new Animal("meow");
    var cow = new Animal("humbow");
//responds different ways
    showInfo(dog);
    showInfo(cat);
    showInfo(cow);


2

जावास्क्रिप्ट एक व्याख्या की गई भाषा है, संकलित भाषा नहीं।

संकलन समय बहुरूपता (या स्थैतिक बहुरूपता) संकलन समय बहुरूपता कुछ और नहीं बल्कि जावा, c ++ में अतिभारित करने की विधि है

इसलिए जावास्क्रिप्ट में मेथड ओवरलोडिंग संभव नहीं है।

लेकिन डायनामिक (रन टाइम) बहुरूपता बहुरूपता है जो रन-टाइम में मौजूद है इसलिए जावास्क्रिप्ट में ओवरराइडिंग विधि संभव है

एक और उदाहरण PHP है।

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