2010-11-06 11 views
6

संभव डुप्लिकेट:
Use of 'prototype' vs. 'this' in Javascript?दो जावास्क्रिप्ट में तरीकों घोषित करने के तरीके

मैं जावास्क्रिप्ट में तरीकों की घोषणा की इन दोनों को दो तरह से देखा है:

var User = function() { 
    this.name = 'Foo'; 
    this.greet = function() { 
     console.log('Hello!'); 
    } 
} 

और

var User = function() { 
    this.name = 'Foo'; 
} 

User.prototype.greet = function() { 
    console.log('Hello!'); 
} 

अंतर क्या हैं?

+1

@Archonix हो जाता है: नहीं यह नहीं है। – kennytm

+1

प्रासंगिक: http://stackoverflow.com/questions/1635116/javascript-class-method-vs-class-prototype- विधि – DaiYoukai

उत्तर

3

यदि आप 'कक्षा' बना रहे हैं, तो आप दूसरे का उपयोग करना चाहते हैं। मैं कोट्स में कक्षा कहता हूं क्योंकि जावास्क्रिप्ट में कक्षा की औपचारिक धारणा नहीं है, क्योंकि यह प्रोटोटाइप विरासत का उपयोग करती है।

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

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

0

आप तो आप उस के लिए बधाई समारोह जोड़ने के लिए, पहले उदाहरण में बनाम "प्रोटोटाइप" "इस" का सही आवेदन के लिए this पोस्ट को देखने के लिए

1

आप अपने उपयोगकर्ता समारोह बनाने के लिए चाहते हो सकता उदाहरण (User.greet() दे रहा है)। लेकिन चूंकि आपके पास यह कन्स्ट्रक्टर फ़ंक्शन में है, तो यह सभी मामलों में जोड़ा जाएगा।

दूसरे उदाहरण में, आप अपने उपयोगकर्ता कन्स्ट्रक्टर को परिभाषित करते हैं। फिर आप उपयोगकर्ता के उदाहरण सभी के लिए बधाई प्रोटोटाइप परिभाषित करते हैं। यह आपका पहला उदाहरण यहाँ के रूप में एक ही बात करने के लिए बाहर आता है, लेकिन अगर अलग ढंग का गठन, परिवर्तन और अधिक स्पष्ट

var User = function() { 
    this.name = 'Foo'; 
} 

var a=new User(); 
var b=new User(); 
a.greet=function(){ 
    alert(this.name); 
} 
/*a has the greet function, b does not*/ 

User.prototype.greet=function(){ 
    alert(this.name); 
} 
/*a and b both have the greet function now, since they are both of class User*/ 
संबंधित मुद्दे