2017-09-15 7 views
10

मैं एक विशिष्ट पृष्ठ पर एक थर्ड पार्टी लाइब्रेरी का विस्तार करने की कोशिश कर रहा हूं, लेकिन मैं किसी भी तृतीय पक्ष कोड को बदलना नहीं चाहता हूं। जब कुछ होता है तो मुझे तीसरे पक्ष की लाइब्रेरी कॉल के कार्यों का नाम पता है, इसलिए यदि मैं अपना खुद का कस्टम कोड इसके बाद निष्पादित करना चाहता हूं, तो मैं यह कैसे कर सकता हूं?जेएस: मूल फ़ंक्शन को छूए बिना किसी फ़ंक्शन को कॉल करें?

तृतीय पक्ष लाइब्रेरी है:

function eventFinished(args){ 
    //library stuff here 
} 

अब अगर यह मेरे अपने कोड था मैं इस तरह कुछ करना चाहते हैं:

function eventFinished(args){ 
    //library stuff here 
    MyCustomFunction(); 
} 

हालांकि, यह नहीं है और मैं ऊपर लिख नहीं करना चाहते स्टॉक लाइब्रेरी कोड। तो क्या उपर्युक्त करने के लिए वैसे भी है, लेकिन मूल फ़ंक्शन कोड को छूए बिना? मेरे पास फ़ंक्शन का संदर्भ होगा, लेकिन यह है।

संपादित करें: मुझे घोषित किया जाना चाहिए कि घोषित कार्य वैश्विक रूप से उपलब्ध है।

+0

समारोह पुस्तकालय बुला रहा है चाहिए संभावना एक संदर्भ में, जहां इसे अधिलेखित करना संभव नहीं है पर मौजूद है। उदा: अगर इसे बंद करने के भीतर घोषित किया गया था तो इसे ओवरराइट करना संभव नहीं था। यह काम करने जा रहा एकमात्र तरीका यह है कि यदि तृतीय पक्ष लाइब्रेरी वैश्विक क्षेत्र में परिभाषित एक फ़ंक्शन का उपयोग कर रही है, जिसे आम तौर पर अनुशंसित नहीं किया जाता है। – nicooga

उत्तर

19

यदि आप आप आप कर सकते हैं "बंदर-पैच" यह इस तरह का विस्तार करना चाहते समारोह के लिए एक संदर्भ पाने के लिए एक तरीका है:

var fnOriginalFunction = functionYouWantToExtend; 
functionYouWantToExtend = function() { 
    fnOriginalFunction.apply(this, arguments); 

    // your code here 
}; 

यह प्रभावी रूप से समारोह आप करना चाहते हैं फिर से लिखते हैं कुछ हद तक निर्बाध तरीके से विस्तार करें।

More information about monkey-patching

7

"मैं किसी विशिष्ट पृष्ठ पर एक तीसरी पार्टी पुस्तकालय का विस्तार करने की कोशिश कर रहा हूँ, लेकिन मैं तीसरे पक्ष के कोड के किसी भी बदलने के लिए नहीं करना चाहती"

यह नहीं किया जा सकता। कोड को किसी भी तरह से प्रतिक्रिया करने के लिए कोड को बदलना होगा जब तक कि कोड एक ईवेंट उत्सर्जित तंत्र या कुछ समान प्रदान न करे।

लाइब्रेरी को प्रभावित किए बिना इस तक पहुंचने का तरीका उस कार्य को ओवरराइट करना है जिसे आप पहले से ही कर चुके हैं और शीर्ष पर अपना कस्टम व्यवहार जोड़कर विस्तार करना चाहते हैं।

उदाहरण के लिए:

const Library = { 
 
    method() { 
 
    console.log('I am the library method'); 
 
    } 
 
} 
 

 
const unalteredMethod = Library.method; 
 
Library.method = function() { 
 
    unalteredMethod.apply(this, arguments); 
 
    console.log('my custom behavior'); 
 
} 
 

 
Library.method();

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