2009-11-17 15 views
5

क्या नीचे दो कोडों के बीच कोई अंतर है, मुझे नहीं लगता है।क्या जावास्क्रिप्ट में "यह" और "प्रोटोटाइप" का उपयोग करने के बीच कोई अंतर है?

function Agent(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret=true; 

    this.isActive = true; 
    this.isMale = false; 
} 

और

function Agent(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret=true; 
} 

Agent.prototype.isActive = true;  
Agent.prototype.isMale = true; 

उत्तर

2

कम से कम एक अंतर है यदि आप this.somevar या prototype.somevar पर एक गैर-आदिम वस्तु निर्दिष्ट कर रहे हैं।

चलाने की कोशिश करें इस:

function Agent(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret=true; 

    this.isActive = true; 
    this.isMale = false; 
    this.myArray = new Array(1,2,3); 
} 

function Agent2(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret = true; 
} 

Agent2.prototype.isActive = true;  
Agent2.prototype.isMale = true; 
Agent2.prototype.myArray = new Array(1,2,3); 

var agent_a = new Agent(); 
var agent_b = new Agent(); 

var agent2_a = new Agent2(); 
var agent2_b = new Agent2(); 

if (agent_a.myArray == agent_b.myArray) 
    alert('agent_a.myArray == agent_b.myArray'); 
else 
    alert('agent_a.myArray != agent_b.myArray'); 

if (agent2_a.myArray == agent2_b.myArray) 
    alert('agent2_a.myArray == agent2_b.myArray'); 
else 
    alert('agent2_a.myArray != agent2_b.myArray'); 
+0

मैं कोशिश की है: agent_a.myArray = agent_b.myArray ' agent2_a.myArray == agent2_b.myArray इसलिए, यह पता चलता है कि कम से "इस का उपयोग करते हुए! "प्रत्येक ऑब्जेक्ट की अपनी संपत्ति होती है, फ़ंक्शन। लेकिन जब मैं प्रोटोटाइप का उपयोग करता हूं, तो इसे साझा किया जाता है। जो एक समस्या हो सकती है क्योंकि जब मैं एक वस्तु पर सरणी बदलता हूं, तो यह अन्य सभी पर बदल जाता है। :( – pencilCake

+0

yup, ऐसा कुछ;) – Lukman

1

नहीं। 'प्रोटोटाइप' जावास्क्रिप्ट में विरासत को लागू करने के लिए इस्तेमाल किया। इस तरह की है कि के रूप में:

/** obsolete syntax **/ 

var Person = Class.create(); 
Person.prototype = { 
    initialize: function(name) { 
    this.name = name; 
    }, 
    say: function(message) { 
    return this.name + ': ' + message; 
    } 
}; 

var guy = new Person('Miro'); 
guy.say('hi'); 
// -> "Miro: hi" 

var Pirate = Class.create(); 
// inherit from Person class: 
Pirate.prototype = Object.extend(new Person(), { 
    // redefine the speak method 
    say: function(message) { 
    return this.name + ': ' + message + ', yarr!'; 
    } 
}); 

var john = new Pirate('Long John'); 
john.say('ahoy matey'); 
// -> "Long John: ahoy matey, yarr!" 

कोड स्रोत और अतिरिक्त जानकारी आप यहाँ पा सकते हैं: http://www.prototypejs.org/learn/class-inheritance

0

कार्यात्मक रूप से, यह एक ही है। उत्तरार्द्ध, हालांकि, Agent वस्तुओं के बीच समानता पर जोर देता है। आप एक झलक में देख सकते हैं कि इन सदस्यों के पास यह मान है, जबकि अधिक जटिल कन्स्ट्रक्टर फ़ंक्शन में, कई सशर्तों के साथ, यह कठिन है।

यह जावास्क्रिप्ट रनटाइम को यह चुनने की अनुमति देता है कि यह Agent सदस्य प्रारंभिकरण को कैसे प्रबंधित करता है। (कुछ प्रीकंपिलेशन करें, ...)

0

मानते हैं कि यह फ़ंक्शन एक कन्स्ट्रक्टर के रूप में उपयोग किया जाना है, नए उदाहरण पर सेट गुणों वाला पहला और प्रोटोटाइप पर दूसरा। यदि वे उदाहरण से स्वतंत्र हैं तो दो स्निपेट समकक्ष हैं, लेकिन यदि वे नहीं हैं (उनके नाम के अनुसार), तो वे नहीं हैं।

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

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