प्रोटोटाइप विधि का क्या मतलब है?


10

मैं जावास्क्रिप्ट के माध्यम से पढ़ रहा हूं : अच्छे भाग , और प्रोटोटाइप पर अनुभाग के चारों ओर अपना सिर पाने के लिए संघर्ष किया ।

थोड़ी सी Google के बाद, मैं इस निष्कर्ष पर पहुंचा कि वस्तुओं को घोषणा के बाद वस्तुओं में जोड़ना है ।

इस स्क्रिप्ट का उपयोग करते हुए w3schools से gleamed, मैंने देखा कि प्रोटोटाइप संपत्ति को जोड़ने वाली रेखा को हटाने का कोई प्रभाव नहीं था । तो फिर विषय बिंदु क्या है?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

(Fred.salary) document.write;


4
@Raynos अच्छी तरह से कहा, लेकिन बहुत एक स्थानापन्न के सुझाव देते हैं, जैसे MDN डॉक्स: developer.mozilla.org/en/JavaScript
StuperUser

जवाबों:


13

ऐसा नहीं है कि प्रोटोटाइप कैसे काम करता है। प्रोटोटाइप श्रृंखला में प्रोटोटाइप का उपयोग किया जाता है।

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

उदाहरण:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

तो प्रोटोटाइप का बिंदु बस कोड री-यूज़ और इनहेरिटेंस है।


ठीक है, तो मैं अब यह मिलता है। लेकिन मैंने एक संपत्ति को गतिशील रूप से जोड़ने की कोशिश की, और यह मुझे बता रहा है prototype is undefined---o.prototype.newProp = "mutts nuts";
मिल्ड फज

3
@ मिल्डफज oएक वस्तु है। .prototypeसंपत्ति कार्यों पर प्रयोग किया जाता है, इसे अनदेखा। बसo.newProp = "mutts nuts"
रेयनोस

7

जब आपने किया था fred.salary=20000तो आपने वेतन विशेषता को केवल जोड़ दिया था । प्रोटोटाइप का उपयोग करते समय, आपके द्वारा बनाए गए सभी कर्मचारियों में वेतन विशेषता होगी।

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

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

Array.prototype.my_custom_method = function() {...}

वहां से, आपके द्वारा बनाए गए सभी सरणियों में, वह विधि उपलब्ध होगी।


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

1
IMO यह अब तक का सबसे अच्छा जवाब है।
मफिन मैन

5

आप इस लेख पर एक नज़र डालना चाह सकते हैं ।

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

यदि आप किसी ऑब्जेक्ट को ऑब्जेक्ट के सेट के लिए प्रोटोटाइप के रूप में उपयोग किए जाने वाले ऑब्जेक्ट में जोड़ते हैं, तो जिन ऑब्जेक्ट्स के लिए यह प्रोटोटाइप है उन्हें नई प्रॉपर्टी भी मिलती है।

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

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


3
कक्षा-आधारित बनाम प्रोटोटाइप-आधारित भाषाओं के लेख के लिए +1
adivasile
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.