2009-12-04 13 views

Respuesta

4

¿Qué pasa con su escenario requiere una biblioteca? Parece que con javascript nativo, que podría simplemente:

  • Guardar una copia de la función original
  • crear una versión modificada de la función que utiliza el original
  • tienda una referencia a la versión modificada en la que el original fue originalmente almacenado.
+0

¿Qué quiere decir con guardar una copia del original? Algo como esto? new_func = originalFunc function myExtendedVersion() { // do my stuff new_func(); // do my stuff }

+0

sí, luego configure originalFunc = myExtendedVersion. –

0

Me gustan las funciones de ajuste proporcionadas por las bibliotecas: Prototype tiene la función de ajuste. En ExtJS, uno puede usar createDelegate o createInterceptor. Dojo tiene un AOP declarativo. sans marco, se podría hacer esto:

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

con jQuery, sería bastante fácil sólo tiene que añadir en otra función de su uso. Pruebe algo como:

//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'); } 
     } 
    ); 
} 

Trate de añadir que a su página, y algo como esto para probarlo:

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

la esperanza que esto le ayuda.

+0

Esto lo hará, gracias. Pero descubrí que la respuesta aceptada es más clara. –

-1

voy a ir a por Frank Schwieterman solución:

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

que podría hacerlo con el plugin jQuery AOP: http://code.google.com/p/jquery-aop/

Código se vería así:

jQuery.aop.around({target: window, method: 'originalFunc'}, 
    function(invocation) { 
    // do your stuff 
    invocation.proceed(); 
    // do your stuff 
    } 
);