में एक निजी फ़ंक्शन के भीतर से मैं सार्वजनिक फ़ंक्शन को कैसे कॉल करूं? जावास्क्रिप्ट मॉड्यूल पैटर्न में एक निजी फ़ंक्शन के भीतर से मैं सार्वजनिक फ़ंक्शन कैसे कॉल करूं?जावास्क्रिप्ट मॉड्यूल पैटर्न
उदाहरण के लिए, निम्नलिखित कोड में,
var myModule = (function() {
var private1 = function(){
// How to call public1() here?
// this.public1() won't work
}
return {
public1: function(){ /* do something */}
}
})();
यह सवाल twicebefore कहा गया है, प्रत्येक के लिए किसी दूसरी स्वीकृत जवाब के साथ।
- इसे वापस करने से पहले रिटर्न ऑब्जेक्ट का संदर्भ सहेजें, और उसके बाद सार्वजनिक विधि तक पहुंचने के लिए उस संदर्भ का उपयोग करें। answer देखें।
- बंद करने में सार्वजनिक विधि का संदर्भ सहेजें, और सार्वजनिक विधि तक पहुंचने के लिए इसका उपयोग करें। answer देखें।
हालांकि ये समाधान काम करते हैं, वे ओओपी बिंदु से असंतोषजनक हैं। मेरा मतलब यह समझाने के लिए, चलो इन समाधानों में से प्रत्येक के साथ एक स्नोमैन का ठोस कार्यान्वयन करें और उन्हें सरल वस्तु के साथ तुलनात्मक रूप से तुलना करें।
स्नोमैन 1: संदर्भ सहेजें वापस जाने के लिए वस्तु
var snowman1 = (function(){
var _sayHello = function(){
console.log("Hello, my name is " + public.name());
};
var public = {
name: function(){ return "Olaf"},
greet: function(){
_sayHello();
}
};
return public;
})()
स्नोमैन 2: सार्वजनिक समारोह के संदर्भ में सहेजें
var snowman2 = (function(){
var _sayHello = function(){
console.log("Hello, my name is " + name());
};
var name = function(){ return "Olaf"};
var public = {
name: name,
greet: function(){
_sayHello();
}
};
return public;
})()
स्नोमैन 3: वस्तु शाब्दिक
var snowman3 = {
name: function(){ return "Olaf"},
greet: function(){
console.log("Hello, my name is " + this.name());
}
}
हम देख सकते हैं कि तीन कार्यक्षमता में समान हैं और सटीक समान विधियां हैं।
हम सरल अधिभावी का एक परीक्षण चलाते हैं, लेकिन
var snowman = // snowman1, snowman2, or snowman3
snowman.name = function(){ return "Frosty";}
snowman.greet(); // Expecting "Hello, my name is Frosty"
// but snowman2 says "Hello, my name is Olaf"
हम चाहते हैं कि # 2 विफल रहता है देखते हैं।
हम प्रोटोटाइप अधिभावी का एक परीक्षण चलाते हैं,
var snowman = {};
snowman.__proto__ = // snowman1, snowman2, or snowman3
snowman.name = function(){ return "Frosty";}
snowman.greet(); // Expecting "Hello, my name is Frosty"
// but #1 and #2 both reply "Hello, my name is Olaf"
हम चाहते हैं कि दोनों # 1 और # 2 असफल देखते हैं।
यह वास्तव में बदसूरत स्थिति है। सिर्फ इसलिए कि मैंने अपने कोड को एक या दूसरे तरीके से दोबारा शुरू करने के लिए चुना है, लौटे ऑब्जेक्ट के उपयोगकर्ता को ध्यान से देखना होगा कि मैंने यह सब कुछ कैसे लागू किया है, यह पता लगाने के लिए कि क्या वह मेरे ऑब्जेक्ट के तरीकों को ओवरराइड कर सकता है और इसे काम करने की उम्मीद करता है ! जबकि राय यहां भिन्न होती है, मेरी राय यह है कि सही ओवरराइड व्यवहार सरल वस्तु का शाब्दिक है।
है वहाँ एक रास्ता एक निजी एक से एक सार्वजनिक विधि कॉल करने के लिए इतना है कि सम्मान के साथ शाब्दिक एक वस्तु की तरह है, जिसके परिणामस्वरूप वस्तु कृत्यों व्यवहार को ओवरराइड करने के लिए:
तो, यह असली सवाल है?
आपके द्वारा चर्चा की जाने वाली समस्याओं में एक महत्वपूर्ण नोट: मॉड्यूल पैटर्न की मेरी समझ यह है कि यह वास्तव में जेएस के प्रोटोटाइप/ओओपी पोलिमोफिज्म दृष्टिकोण का विकल्प है। इस प्रकार, मुझे लगता है कि यह आपके लिए दोनों का उपयोग करने से बचने के लिए समझ में आता है - मुझे यह नहीं लगता कि यह एक गड़बड़ी * प्रति * के रूप में नहीं है। – EyasSH
@ आईएएसएसएच- इसका उपयोग इस तरह से किया जा सकता है, हालांकि मुझे लगता है कि यह एक आर्टेफैक्ट है जिसका उपयोग जानबूझकर सुविधा के बजाय किसी प्रकार की विरासत के लिए किया जा सकता है। ऐसा लगता है कि मुख्य रूप से निजी सदस्यों को अनुकरण करने के लिए उपयोग किया जाता है (या उन चीजों को उजागर नहीं करना जिन्हें दूसरों के साथ नहीं खेलना चाहिए) और प्रदर्शन में सुधार करने के लिए भी। – RobG
@RobG, ठीक है, लेकिन प्रोटोटाइप पैटर्न के साथ चिपके रहते हुए आप बंद होने में निजी कार्यों को घोषित कर सकते हैं। उस स्थिति में, '' '''' का उपयोग करना ठीक है। मेरा मुद्दा यह है कि, यदि आप मॉड्यूल पैटर्न का उपयोग कर रहे हैं, तो मुझे लगता है कि मॉड्यूल <-> प्रोटोटाइप इंटरैक्शन अजीबता एक दृष्टिकोण का उपयोग न करने का वास्तविक कारण नहीं है। यदि आप सोचते हैं कि जो भी आपका कोड उपयोग कर रहा है, वह प्रोटोटाइप को पूरी तरह से चिपकने का एक कारण हो सकता है .. – EyasSH