पहले, आइए कितनी आसानी से कई विकल्प समर्थन करने के लिए को देखो। इसका एक सामान्य समाधान यह है कि आपका कन्स्ट्रक्टर केवल सरल स्ट्रिंग या संख्या तर्कों के बजाय "कॉन्फ़िगरेशन" ऑब्जेक्ट में ले जाए। बजाय इस प्रपत्र का उपयोग पर विचार करें:
var Tooltip = function(selector, options) {
this.targetElement = document.querySelectorAll(selector);
this.options = options;
...
};
var box = new Tooltip(".box", { color: "red" });
सूचना है कि बजाय एक ही मूल्य में उत्तीर्ण होने की, हम एक उद्देश्य यह है कि है कि एकल मान में गुजरती हैं। लेकिन उस ऑब्जेक्ट में संभावित रूप से कई कॉन्फ़िगरेशन विकल्प हो सकते हैं - केवल एक ही नहीं! उदाहरण के लिए, आप पास कर सकता है:
var box = new Tooltip(".box", {
backgroundColor: "red",
textColor: "white",
fontSize: 12,
animated: true,
animationSpeed: 1000
});
जब आप उन विकल्पों में से किसी का उपयोग करने की जरूरत है, अपने कोड बस विकल्प के संदर्भ में उपयोग कर सकते हैं आपत्ति: उदाहरण के लिए, this.bcolor
के बजाय, आप this.options.backgroundColor
का उपयोग हो सकता है।
Tooltip.prototype.tooltip = function() {
for (var i = 0; i < this.targetElement.length; i++) {
...
span.style.backgroundColor = this.options.backgroundColor;
span.style.color = this.options.textColor;
span.style.fontSize = this.options.fontSize + "px";
...
}
}
तो इस तरह आप कई विकल्प संभाल होता है, यहाँ से ऊपर अपने कोड, कुछ और विकल्प के साथ बढ़ाया है लेकिन प्रत्येक के लिए डिफ़ॉल्ट मान के बारे में क्या?
Tooltip.prototype.defaultOptions = {
backgroundColor: "#FF9",
textColor: "black",
fontSize: 12,
animated: false,
animationSpeed: 1000
};
और फिर अपने निर्माता defaultOptions
से अधिक स्पिन सकता है, बशर्ते में अपने मूल्यों का उपयोग कर किसी भी लापता "छेद" को भरने के लिए: ऐसा करने के लिए, आपको पहले मूलभूत मूल्यों दिखाई देते हैं यह कहीं न कहीं परिभाषित करना चाहते हैं options
वस्तु:
var Tooltip = function(selector, options) {
this.targetElement = document.querySelectorAll(selector);
this.options = options;
for (var optionName in this.defaultOptions) {
if (typeof this.options[optionName] === 'undefined')
this.options[optionName] = this.defaultOptions[optionName];
}
...
};
undefined
के मूल्य के लिए एक typeof
के खिलाफ एक परीक्षण सही ही अगर मूल्य मौजूद नहीं है, इसलिए इस के लिए लूप प्रतियां defaultOptions
से options
के लिए किसी भी मूल्यों, जब तक कि वे डॉन 'के रूप में टी options
में पहले से मौजूद है। यह अच्छा और एक्स्टेंसिबल है: जैसे ही आप defaultOptions
पर एक नया मान जोड़ते हैं, लूप इसे options
में कॉपी करेगा, इससे कोई फर्क नहीं पड़ता कि कॉलर पहले क्या गुजर रहे थे।
और, सबसे महत्वपूर्ण बात यह है कि for
लूप वास्तव में सभी jQuery.extend
हुड के तहत कर रहा है: एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट को कॉपी करना। (JQuery समाधान थोड़ा और अधिक सुरुचिपूर्ण है, लेकिन मैं यहाँ बातें क्या हो रहा है यह और भी स्पष्ट करने के लिए सरल बनाया।)
लेकिन क्या होगा अगर आप कुछ स्थानों में डिफ़ॉल्ट व्यवहार करना चाहते हैं? उदाहरण के लिए, यदि आप एक विशिष्ट फ़ॉन्ट आकार को परिभाषित नहीं करते हैं, तो हो सकता है कि आप इसे defaultOptions
से कुछ असाइन किए जाने के बजाय मूल तत्व या दस्तावेज़ से प्राप्त करना चाहते हैं।
यदि आप उस तरह के "डॉन-असाइन-इन-जब तक प्रदान नहीं किए गए" व्यवहार चाहते हैं, तो उपरोक्त एक ही मूलभूत पैटर्न काम कर सकता है, लेकिन आपको डिफ़ॉल्ट विकल्पों को थोड़ा छोटा करने की आवश्यकता है, और फिर एक शर्त जोड़ें आप विकल्प लागू कर रहे हैं। विचार करें कि इस उदाहरण क्या मैं ऊपर से पता चला है से अलग है:
// Notice that we specifically leave out fontSize here in the defaults.
Tooltip.prototype.defaultOptions = {
backgroundColor: "#FF9",
textColor: "black",
animated: false,
animationSpeed: 1000
};
Tooltip.prototype.tooltip = function() {
for (var i = 0; i < this.targetElement.length; i++) {
...
span.style.backgroundColor = this.options.backgroundColor;
span.style.color = this.options.textColor;
// Now, we only assign the fontSize if it was provided by the user.
if (typeof this.options.fontSize !== 'undefined')
span.style.fontSize = this.options.fontSize + "px";
...
}
}
यह उम्मीद है कि पर्याप्त आप के साथ काम करने के लिए किया जाना चाहिए। इस पर
बदलाव (Object.extend
पैटर्न और undefined
के खिलाफ परीक्षण) सभी जावास्क्रिप्ट में जगह उपयोग किया जाता है, और भारी jQuery और अन्य पुस्तकालयों की एक पूरी मेजबान के द्वारा किया जाता है। यदि आप वही मूल डिजाइन का पालन करते हैं, तो आप बहुत अच्छी कंपनी में होंगे।
आपके शानदार उत्तर के लिए धन्यवाद! जब मैं कोई मान नहीं देता, तो यह डिफ़ॉल्ट विकल्पों से क्यों नहीं लेता है? >> https://jsfiddle.net/efw8c352/ – Norx
आपका उदाहरण पहेली ने किसी भी 'विकल्प' ऑब्जेक्ट को कन्स्ट्रक्टर को पास नहीं किया; आपको उस कोड के साथ जावास्क्रिप्ट कंसोल पर शायद एक त्रुटि है! इसलिए डिफ़ॉल्ट मान असाइन नहीं किए जा रहे हैं क्योंकि उन्हें असाइन करने के लिए कोई ऑब्जेक्ट नहीं है। आप 'नया टूलटिप ("बॉक्स", {})' (एक खाली वस्तु) पास करके इसे ठीक कर सकते हैं। या, इसके बजाय, आप 'विकल्प = विकल्प || जोड़ सकते हैं {}; 'कन्स्ट्रक्टर की पहली पंक्ति के रूप में, जो एक' अपरिभाषित '(गायब) विकल्प ऑब्जेक्ट को' {} 'खाली ऑब्जेक्ट में बदल देगा जिसे लूप तब असाइन किया जा सकता है। –
मैं समझता हूं। आपकी भयानक मदद के लिए धन्यवाद! – Norx