2017-06-13 7 views
6

सही ढंग से निम्नलिखित कार्यक्रम को देखते हुए, कंसोल लॉग - ध्यान दें श्रृंखलित init समारोह और return this:Object.create, चेनिंग और 'इस'

const cat = { 
 
    init(sound) { 
 
    this.sound = sound; 
 
    return this; 
 
    }, 
 
    makeSound() { 
 
    console.log(this.sound); 
 
    } 
 
}; 
 

 
const fluffy = Object.create(cat).init('meeeaaaauuu'); 
 
fluffy.makeSound();

मेरा प्रश्न: कैसे और क्यों है return this इसके लिए काम करने के लिए आवश्यक है? इसके साथ नीचे त्रुटि देखें हटाया:

const cat = { 
 
    init(sound) { 
 
    this.sound = sound; 
 
    // return this 
 
    }, 
 
    makeSound() { 
 
    console.log(this.sound); 
 
    } 
 
}; 
 

 
const fluffy = Object.create(cat).init('meeeaaaahuuu'); 
 
fluffy.makeSound();

MDN राज्यों Object.create नई वस्तु देता है, तो init() चाहिए काम ... के माध्यम से यह सोच रही थी ... चेनिंग क्या ऐसा इसलिए है क्योंकि नई वस्तु जो जंजीर है अभी भी 'अज्ञात' है?

ध्यान दें कि यदि init(), अपनी स्वयं की पंक्ति, सभी काम करता है के रूप में मैं उम्मीद करेंगे हो जाता है return this की जरूरत के बिना:

const fluffy = Object.create(cat); 
fluffy.init('meeeaaaahuuu'); 
fluffy.makeSound(); 
+5

आपका 'init' विधि कुछ भी नहीं देता है के लिए इस तरह लिखा जा सकता था। तो 'कॉन्स्ट फ्लफी' 'अपरिभाषित 'के बराबर है। इसका ऑब्जेक्ट.क्रेट 'के साथ कुछ लेना देना नहीं है। – zerkms

+0

ओह - तो जब कोई ऐसी विधि को चेन करना जो कुछ भी वापस नहीं करता है, तो मूल वापसी मूल्य (नई बिल्ली वस्तु) खो जाती है? कॉन्स फ्लफी उस ऑब्जेक्ट के साथ नई वस्तु के बराबर नहीं है? – calipoop

+5

"चुंबन" का इलाज कुछ जादुई या विशेष के रूप में न करें। यदि यह संभव था तो मैं कानूनी रूप से "चेनिंग" शब्द का उपयोग करने पर भी प्रतिबंध लगा दूंगा: किसी कारण से लोग किसी विशेष कार्य को उस फ़ंक्शन में डाल देते हैं जो कुछ देता है। – zerkms

उत्तर

13

कारण यह काम करता है:

const fluffy = Object.create(cat); 
fluffy.init('meeeaaaahuuu'); 
fluffy.makeSound(); 

क्योंकि आप बताए रहे हैं fluffyObject.create का वापसी मूल्य। जब आप const fluffy = Object.create(cat).init('meeeaaaahuuu'); करते हैं, तो आप init को Object.create के वापसी मूल्य पर कॉल कर रहे हैं, और init से fluffy पर वापसी मान असाइन कर रहे हैं, जो undefined पर वापसी विवरण के बिना है।

4

@zerkms का उल्लेख है, यदि init में वापसी का विवरण नहीं है, तो यह undefined वापस आ जाएगा।

निम्न पंक्ति में, fluffy द्वारा init

const fluffy = Object.create(cat).init('meeeaaaahuuu'); 

दिए गए मान सौंपा जा रहा है init एक रिटर्न बयान नहीं होता, fluffy मूल्य undefined

console.log(fluffy); // undefined 

आवंटित किया जाएगा, तो init रिटर्न ऑब्जेक्ट को cat पर असाइन किया जा रहा है, तो fluffy उस मान को असाइन किया जाएगा।

इस एक और तरीका प्रदर्शित करने के लिए, अपने श्रृंखलित असाइनमेंट बयान const fluffy = Object.create(cat).init('meow'); ही परिणाम

let fluffy = Object.create(cat); 
fluffy = init('meow'); 
+0

पूर्ण उत्तर के लिए धन्यवाद!केली ने इसे इस तरह उत्तर दिया जो मेरे दिमाग पर आसान था, इसलिए मैं उसे चेक दूंगा, भले ही दोनों उत्तरों अच्छे लगें और मदद करें। इसके अलावा, आप वर्तमान में 9, 999 प्रतिनिधि पर हैं और यह बहुत अच्छा है;) – calipoop

+0

एनपी। मुझे @ केली का जवाब भी पसंद आया :) – sfletche

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