2009-12-04 11 views
5

मुझे एक तृतीय पक्ष फ़ंक्शन को सजाने की ज़रूरत है जिसे मैं संशोधित नहीं कर सकता, इसलिए मुझे इसे किसी भी तरह से सजाने की आवश्यकता होगी। मैंने पाया कि प्रोटोटाइप में आसानी से ऐसा करने के लिए कुछ है [1]।जावास्क्रिप्ट सजावट HOWTO?

क्या jQuery या सादे जावास्क्रिप्ट में इसका कोई विकल्प है?

[1] http://api.prototypejs.org/language/Function/prototype/wrap/

+0

नोट: आवश्यकता jquery या plain js के साथ ऐसा करने के लिए, एक और जेएस ढांचे को जोड़ नहीं सकते हैं। –

उत्तर

4

क्या अपने परिदृश्य के बारे में एक पुस्तकालय की आवश्यकता है? ऐसा लगता है कि देशी जावास्क्रिप्ट के साथ, आप बस कर सकते थे:

  • सहेजें मूल कार्य
  • की एक प्रति समारोह जो मूल
  • स्टोर संशोधित संस्करण के लिए एक संदर्भ का उपयोग करता है का एक संशोधित संस्करण बनाएं जहां मूल मूल रूप से संग्रहीत किया गया था।
+0

मूल की एक प्रति सहेजने के साथ आपका क्या मतलब है? ऐसा कुछ? new_func = originalFunc function myExtendedVersion() { // do my stuff new_func(); // do my stuff }

+0

हाँ, फिर originalFunc = myExtendedVersion सेट करें। –

0

मुझे लाइब्रेरी द्वारा प्रदान किए गए रैप फ़ंक्शंस पसंद हैं: प्रोटोटाइप में रैप फ़ंक्शन है। ExtJS में, कोई createDelegate या createInterceptor का उपयोग कर सकता है। डोजो की घोषणात्मक एओपी है। संस ढांचे, एक ऐसा करने दे सकता है:

myFunction(){ 
    something(); 
    thirdParty.call(); // or apply 
    perhapsSomethingElse(); 
} 
1

jQuery के साथ, यह सिर्फ एक और समारोह का उपयोग करने के जोड़ने के लिए बहुत आसान हो जाएगा। इसे बाहर का परीक्षण करने के इस तरह

//Sample function you're wrapping around 
function say_hi(){ 
    alert('hi'); 
} 

//quick jq plugin 
jQuery.fn.functionWrap = function(arg,opts){ 
    if(opts.before && typeof(opts.before)=='function'){ 
     opts.before(); 
    } 
    arg(); 
    if(opts.after && typeof(opts.after)=='function'){ 
     opts.after(); 
    } 
}; 


//sample function to use the wrapper func 
function btnPress(){ 
    $().functionWrap(
     say_hi, 
     { 
      before : function(){ alert('happens before'); }, 
      after : function(){ alert('happens after'); } 
     } 
    ); 
} 

कोशिश अपने पृष्ठ के लिए कहा कि, और कुछ: की तरह कुछ प्रयास करें

<input type="button" value="asdf" onClick="btnPress();" /> 

आशा यह आप में मदद करता है।

+0

यह ऐसा करेगा, धन्यवाद। लेकिन मैंने पाया कि स्वीकृत उत्तर स्पष्ट है। –

-1

मैं फ्रैंक Schwieterman समाधान के लिए जाना होगा:

new_func = originalFunc 
function myExtendedVersion() 
{ 
    // do my stuff 
    new_func(); 
    // do my stuff 
} 
0

आप jQuery AOP प्लगइन के साथ यह कर सकता है: http://code.google.com/p/jquery-aop/

कोड दिखाई देगा:

jQuery.aop.around({target: window, method: 'originalFunc'}, 
    function(invocation) { 
    // do your stuff 
    invocation.proceed(); 
    // do your stuff 
    } 
); 
संबंधित मुद्दे