2011-12-08 20 views
191

संभव डुप्लिकेट:
Understanding prototypal inheritance in JavaScriptप्रोटोटाइप का उद्देश्य क्या है?

ठीक है, इसलिए मैं कुछ हद तक जे एस में OOP के विचार के लिए नया हूँ।

क्या कोड के इन दो के टुकड़े के बीच का अंतर नीचे लिखा है:

function animal(){ 
    this.name = 'rover'; 
    this.set_name = function(name){ 
     this.name = name; 
    } 
} 
function animal(){ 
    this.name = 'rover'; 
} 
animal.prototype.set_name = function(name){ 
    this.name = name; 
} 

वे दोनों एक ही बात करते हैं, तो क्या अंतर है?

+0

एक वर्ग के लिए आवृत्ति स्तर साझा सदस्य (गैर स्थैतिक)। उदाहरण) Person.prototype.instance_counter = 0; // Person.instance_counter जैसे क्लासनाम के साथ एक्सेस नहीं किया जा सकता है (यह स्थिर है।) –

उत्तर

271

प्रोटोटाइप का उपयोग तेजी से ऑब्जेक्ट सृजन के लिए बनाता है, क्योंकि जब भी कोई नई ऑब्जेक्ट बनाई जाती है तो उस फ़ंक्शन को फिर से बनाया नहीं जाना चाहिए।

जब आप ऐसा करते:

function animal(){ 
    this.name = 'rover'; 
    this.set_name = function(name){ 
     this.name = name; 
    } 
} 

set_name समारोह बनाई गई है नए सिरे से हर बार आप एक जानवर पैदा करते हैं। लेकिन जब आप यह

animal.prototype.set_name = function(name){ 
    this.name = name; 
} 

फ़ंक्शन को हर बार फिर से बनाया जाना आवश्यक नहीं है; यह प्रोटोटाइप में एक ही स्थान पर मौजूद है। तो जब आप someAnimal.set_name("Ubu"); पर कॉल करते हैं तो this संदर्भ someAnimal पर सेट किया जाएगा और (केवल एकमात्र) set_name फ़ंक्शन कॉल किया जाएगा।


एक लाभ हालांकि पहले सिंटैक्स का उपयोग करने के लिए नहीं है:

function animal(){ 
    var privateData = 'foo' 

    this.name = 'rover'; 
    this.set_name = function(name){ 
     this.name = name; 
     alert(privateData); //will alert 'foo' 
    } 
} 

डगलस Crockford कि कारण के लिए कहता है यह "विशेषाधिकार" की तरह बनाई गई कार्य: इस तरह से बनाया कार्यों निजी डेटा के लिए उपयोग होगा : उनके पास सार्वजनिक, और निजी डेटा दोनों तक पहुंच है।

28

अंतर दिखाई देता है जब आप

var animal1 = new animal(); 

सभी वस्तुओं पहले समारोह के द्वारा बनाई गई विभिन्न name और set_name गुण होगा इन समारोह से नई वस्तु बनाने। हालांकि, दूसरे फ़ंक्शन द्वारा बनाई गई सभी ऑब्जेक्ट्स set_name संपत्ति साझा करेंगी।

19

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

पहले संस्करण का लाभ यह है कि विधियां कन्स्ट्रक्टर के अंदर घोषित स्थानीय (निजी) चर का उपयोग कर सकती हैं।

दूसरी विधि का लाभ यह है कि इसे कम स्मृति की आवश्यकता होती है (क्योंकि आप केवल दस लाख बार की बजाय विधि को स्टोर करते हैं) और वर्तमान जेएस इंजन में अधिक प्रदर्शनशील है।

दूसरी विधि का उपयोग करके आप कक्षा में विधियों को भी संशोधित या जोड़ सकते हैं जो पहले से बनाए गए उदाहरणों को भी प्रभावित करता है।

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