2010-08-04 11 views
21

En este código creé una función llamada someFunction. Luego modifiqué Function.prototype.apply y call methods. Entonces, en lugar de que mi código de función funcione, estoy ejecutando mi código de interceptación (que muestra una alerta). Pero ni "llamar" ni "aplicar" intercepta la llamada al método directo. ¿Es posible interceptar esto?¿Puedo interceptar una función llamada directamente?

Function.prototype.call = function(){alert("call");}; 
Function.prototype.apply = function(){alert("apply");}; 
function someFunction(){} 
window.onload = function(){ 
    someFunction.call(this); //call alert is shown 
    someFunction.apply(this); //apply alert is shown 
    someFunction(); //how can I intercept this? 
} 

Respuesta

27

sólo se puede anular una función conocida mediante el establecimiento de otra función en su lugar (por ejemplo, no se puede interceptar todas las llamadas de función):

(function() { 
    // An anonymous function wrapper helps you keep oldSomeFunction private 
    var oldSomeFunction = someFunction; 

    someFunction = function() { 
     alert("intercepted!"); 
     oldSomeFunction(); 
    } 
})(); 

Tenga en cuenta que, si ya se someFunction alias/referenciado por otro script antes de que este código lo cambiara, esas referencias seguirían indicando que la función de reemplazo no debe ser anulada por la función de reemplazo.

+0

Tal vez pueda cambiar la función Function.constructor por lo que cada función vuelto tendrá su envoltura alrededor de ella. – yilmazhuseyin

+2

@yilmazhuseyin: no, no puedes. Cambiar el constructor * Function * solo le permitiría anular funciones creadas con 'new Function (str)'. –

+0

sí, tienes razón. function newConstructor() {alert ("a");}; Function.prototype.constructor = newConstructor; no funcionó. – yilmazhuseyin

2

Podría recorrer el alcance global y reemplazar cualquier objeto del tipo de función que encuentre que no sea "suyo".

3

Existe la posibilidad de que pueda interceptar función directa llamada. Esto requiere:

  • la función es creada por Function.prototype.bind y hay que sobrescribir Function.prototype.bind antes de crear la función, o
  • La función se crea a partir de la función() (o nueva Función()) y también debe sobrescribir la función Función antes de crear la función objetivo.

Si ninguno de los dos anteriores pueden ser satisfechas, la única manera de interceptar una llamada directa es envolver la función objetivo, que es la solución aportada por AndyE https://stackoverflow.com/a/3406523/1316480

Para una función que se crea por función literal y está oculta en ámbito privado, no hay forma de interceptar una llamada directa a ella.

que tienen un blog concluye todos ellos: http://nealxyc.wordpress.com/2013/11/25/intercepting-javascript-function/

Cuestiones relacionadas