2010-11-24 8 views
5

संभव डुप्लिकेट:
Use of 'prototype' vs. 'this' in Javascript?"इस" बनाम "प्रोटोटाइप" के माध्यम से फ़ंक्शन असाइन करने के बीच क्या अंतर है?

मैं एक समारोह के लिए एक विधि जोड़ने के इन दो प्रकार के साथ उलझन में हूँ। मुझे एक उदाहरण के साथ समझाओ।

 
var foo = function(){ 
    this.bar = function(){alert('I am a method')} 
} 

foo.prototype.baz = function(){alert('I am another method')} 

var car = new foo(); 

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

धन्यवाद ..

उत्तर

9

कार्य prototype करने के लिए आवंटित सभी उदाहरणों द्वारा साझा किया जाएगा; कन्स्ट्रक्टर में असाइन किए गए कार्यों में प्रति उदाहरण एक अलग फ़ंक्शन ऑब्जेक्ट होगा।

इसके अलावा, कन्स्ट्रक्टर में असाइन किए गए फ़ंक्शंस कन्स्ट्रक्टर के चर और पैरामीटर का उपयोग कर सकते हैं।

उदाहरण के लिए:

var foo = function(param){ 
    this.bar = function() { alert('I can see a parameter: ' + param); }; 
} 

foo.prototype.baz = function() { alert('I can't see foo's parameters'); }; 

var car = new foo("Hi there!"); 
car.bar(); 
1
var foo = function(){ 
    this.bar = function(){alert('I am a method')} 
} 

यह प्रत्येक foo उदाहरण अपने आप में एक बार विधि देता है। तो,

var car1 = new foo(); 
var car2 = new foo(); 
car2.bar = //new function definition here. 
//car1.bar doesn't change. 

दूसरे मामले में:

foo.prototype.baz = function(){alert('I am another method')} 

आप समारोह foo के प्रोटोटाइप श्रृंखला के लिए एक समारोह संलग्न कर रहे हैं। तो, प्रत्येक उदाहरण एक ही विधि हो जाता है। बदलना बाज़ प्रत्येक इंस्टेंस पर फ़ंक्शन को बदल देगा क्योंकि प्रत्येक इंस्टेंस को एक ही फ़ंक्शन प्राप्त होता है।

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

+0

** गलत **। एक इंस्टेंस सदस्य को फिर से असाइन करना उस उदाहरण के लिए प्रोटोटाइप को छुपाएगा। – SLaks

+0

तो इन दो संतोषजनक उत्तर के बाद, मैं समझूंगा कि, यदि प्रोटोटाइप के साथ कोई विधि जोड़ना है तो सभी उदाहरण विधि साझा करते हैं और यह स्मृति प्रबंधन के मुद्दों के बारे में है। क्या मैं सही हू? – Fatih

+0

@ लोरेन्ज़ो: जब तक आप लाखों उदाहरण नहीं बना रहे हैं, तो इसके बारे में चिंता न करें। – SLaks

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

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