2010-07-28 16 views
8

मैं कोड की निम्न 2 सेट के अंतर को समझने के लिए संघर्ष कर रहा हूँ के माध्यम से संपत्ति काम। मूल कोड the famous Ninja tutorial से है और मैंने अपने लिए थोड़ा सा सरल बना दिया है।जावास्क्रिप्ट: प्रोटोटाइप

प्रश्न: मुझे लगता है कि मैं समझता हूं कि कोडेए कैसे काम करता है। Ninja.prototype.swung = falsefunction Ninja() में एक नई संपत्ति असाइन कर रहा है, और ninjiaA.swung उस वजह से झूठी मूल्यांकन करता है। हालांकि, CodeB, में जब हम घोषणा करते हैं शुरुआत में this.swung = true साथ function Ninja(), Ninja.prototype.swung = false के बाद के काम एक प्रभाव नहीं ले करता है, और ninjaA.swung सच करने के लिए मूल्यांकन किया जाना बना रहता है। मैं समझने में असफल रहा हूं कि बाद में असाइनमेंट कोडब में क्यों काम नहीं करता है। क्या कोई मुझे इस पर प्रबुद्ध कर सकता है?

CodeA:

function Ninja(){} 
Ninja.prototype.swung = false; 
var ninjaA = new Ninja(); 
ninjaA.swung; //evaluates to false 

CodeB:

function Ninja(){ 
    this.swung = true; 
} 
Ninja.prototype.swung = false; //I'm expecting this changes swung to false, 
           //but it doesn't. 
var ninjaA = new Ninja();  
ninjaA.swung; //evaluates to true 

धन्यवाद अग्रिम में एक बहुत।

उत्तर

15

जब आप एक संपत्ति this निर्माता समारोह के अंदर का उपयोग कर की घोषणा, यह है कि निर्माता के हर वस्तु से जुड़ी हो जाता है।

जब आप उस कन्स्ट्रक्टर फ़ंक्शन के प्रोटोटाइप पर कोई संपत्ति घोषित करते हैं, तो यह वहां रहता है और उस कन्स्ट्रक्टर की सभी ऑब्जेक्ट इसका संदर्भ लेती है। जब आपके पास ऑब्जेक्ट में और प्रोटोटाइप श्रृंखला में समान नाम के साथ कोई संपत्ति है, तो ऑब्जेक्ट की प्रॉपर्टी प्रोटोटाइप पर एक को छुपाती है।

सोचो कैसे संपत्ति प्रोटोटाइप श्रृंखला है जो हो सकता है बातें स्पष्ट करता है में मूल्यांकन किया जाता है।

CodeA:

 
ninjaA.swung 

1. Is swung a property of the current object - No 
2. Is swung a property of the current object's prototype - Yes 
    2.1. Return it 

CodeB:

 
ninjaA.swung 

1. Is swung a property of the current object? - Yes 
    1.1 Return it 

कोड बी में, यह प्रोटोटाइप पर संपत्ति के लिए कभी नहीं हो जाता है।

+2

+1 - अच्छी तरह से बाहर रखा! –

+0

मैंने 'pre' टैग का उपयोग करने के लिए आपका उत्तर संपादित किया। मुझे जवाब की गुणवत्ता से अलग करने के लिए लगभग विनोदी रंग मिलते हैं। – ChaosPandion

+0

@ डैन - धन्यवाद :) @CoosPandion - परिवर्तन के लिए धन्यवाद, अब बहुत बेहतर दिखता है :) – Anurag

6

एक निर्माता के रूप में Ninja पर कॉल करते समय आप true से swung पर मान निर्दिष्ट करते हैं। इससे पहले कि निर्माता निष्पादित किया जाता है वस्तु इस तरह दिखेगा:

{ 
    prototype : { 
     swung : false 
    } 
} 

के बाद निर्माता निष्पादित होने को देखने के लिए

{ 
    prototype : { 
     swung : false 
    }, 
    swung : true 
} 

जब आप संपत्ति swung के लिए पूछने के प्रोटोटाइप श्रृंखला प्रत्येक स्तर पर जाँच की जाएगी अगर यह मौजूद है। यदि यह मौजूद नहीं है तो undefined मान वापस कर दिया जाएगा।

+1

+1 अपने नए अतिरिक्त यह बहुत क्या हो रहा है के रूप में स्पष्ट कर दूं। – Anurag

+1

@ अनुराग - धन्यवाद, मुझे लगता है कि यह समझाने का आपका चरण-दर-चरण तरीका एक नौसिखिया को बेहतर समझने में मदद करेगा। – ChaosPandion

3

जावास्क्रिप्ट में विधि प्रोटोटाइप के साथ जोड़ दिया केवल लागू करता है, तो विधि उदाहरण पर पहले नहीं मिला है है।

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