2012-04-12 14 views
63

पर प्रारंभिक और कन्स्ट्रक्टर के बीच क्या अंतर है रीढ़ की हड्डी मॉडल पर प्रारंभ और कन्स्ट्रक्टर के बीच क्या अंतर है।रीढ़ की हड्डी मॉडल

जब मैं रीढ़ की हड्डी मॉडल (पेरेंट मॉडल) का विस्तार करता हूं तो मैं किसी भी डिफ़ॉल्ट गुण को सेट करने के लिए प्रारंभिक विधि का उपयोग करता हूं। लेकिन जब भी मैं अभिभावक मॉडल के आधार पर एक मॉडल बनाता हूं तो मैं किसी भी आंतरिक कार्यक्षमता को चलाने के लिए कन्स्ट्रक्टर का उपयोग करता हूं। मैं ऐसा इसलिए करता हूं क्योंकि यह काम करता है लेकिन काम पर किसी ने मुझसे पूछा कि मैं प्रारंभिक और कन्स्ट्रक्टर दोनों का उपयोग क्यों करता हूं और मेरे पास काम करने के अलावा कोई अच्छा जवाब नहीं था। स्रोत कोड को समझने के लिए मैं समय पढ़ने में व्यतीत कर सकता था लेकिन यहां पूछना और सही जवाब प्राप्त करना बहुत आसान लग रहा था।

var ParentModel = Backbone.Model.extend({ 
    initialize : function() { 
    // code here 
    }, 
}); 


var Model = ParentModel.extend({ 
    constructor : function (options) { 
    Backbone.Model.prototype.constructor.call(this, options); 
    // code here 
    }, 
+1

ध्यान रखें कि, जैसे कि आपका 'कन्स्ट्रक्टर()' आधार 'कन्स्ट्रक्टर() 'कहता है,' प्रारंभिक() 'का आपका ओवरराइड शुरू होना चाहिए (कम से कम उस मामले में जहां आप इस पैटर्न का उपयोग करने के लिए क्या कर रहे हैं पहले से ही एक विस्तारित मॉडल बनें) ' के साथ। प्रारंभ करें। एपली (यह, तर्क);', किसी भी आधार-परिभाषित 'प्रारंभिक()' को पहले चलाने के लिए अनुमति दें। (इसने मुझे संयुक्त जेएसएस में पकड़ा, जिसका पहले से ही अपने स्वयं के व्युत्पन्न मॉडल पर परिभाषित 'प्रारंभिक()' है।) – JonBrave

उत्तर

84

constructor बैकबोन संरचना को स्थापित करने से पहले चलता है। initialize संरचना के constructor फ़ंक्शन के अंदर बुलाया जाता है। तो मूल रूप से यदि आपको बैकबोन संरचना को सेट करने से पहले कुछ भी बढ़ाने की आवश्यकता है, तो constructor का उपयोग करें यदि आपको बैकबोन संरचना को initialize सेट करने के बाद कुछ भी बढ़ाने की आवश्यकता है।

(एक Github discussion on the subject से)

+1

प्रतिक्रिया लड़के – screenm0nkey

30

constructor समारोह रीढ़ ही सेट करने के लिए उपयोग करता है -, मॉडल बनाने की घटनाओं की स्थापना, और अन्य सेटअप के सभी प्रकार कर रही। इसे ओवरराइड करने के बारे में बहुत सावधान रहें, क्योंकि यदि आप बैकबोन कोड को ओवरराइडिंग या शेडिंग करके चलने से रोकते हैं, तो आपको अजीब त्रुटियां मिलेंगी जो डीबग करना मुश्किल है।

initialize दूसरी तरफ एक ऐसा कार्य है जो बैकबोन अपनी आंतरिक नलसाजी के साथ समाप्त होने के बाद अपनी वस्तुओं पर कॉल करता है। यदि आप ऐसा कुछ भी नहीं कर रहे हैं जो विशेष रूप से सामान्य बैकबोन कार्यक्षमता में हस्तक्षेप करने का इरादा रखता है, तो बस प्रारंभ करें का उपयोग करें।

यदि आप कॉफीस्क्रिप्ट का उपयोग कर रहे हैं, तो यह constructor का उपयोग करने के लिए अधिक सहज हो सकता है। (यह मेरे लिए है)। बस सुनिश्चित करें कि आप हमेशा super पर कॉल करते हैं।

+1

के लिए धन्यवाद सुपर कॉलिंग पर अच्छा नोट, जिसने मेरी मदद की। धन्यवाद! – Andrew

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