2011-02-18 7 views
5

Estoy escribiendo algunos bookmarklets aquí y tengo algunas preguntas relacionadas con las funciones incorporadas de JavaScript.reemplazar de forma no recursiva las funciones de Javascript integradas

Digamos que deseo reemplazar la función de aviso incorporada (no necesariamente en un bookmarklet). Parece bastante fácil, pero ¿hay alguna manera de llamar a la función de solicitud incorporada desde este reemplazo?

prompt = function(message){ 
    var tmp = prompt(message); 
    hook(tmp); 
    return tmp; 
} 

No pude obtener el alcance para que funcionase bien; este ejemplo produce recursión infinita.

También hay una manera de restaurar el comportamiento predeterminado de una función javascript incorporada que se ha reemplazado (sin aferrarse a una referencia adicional).

+0

sangría de líneas de 4 espacios, si desea escribir código. – nyuszika7h

Respuesta

6
(function() { 
    var old_prompt = prompt; 
    prompt = function (msg) { 
     var tmp = old_prompt(msg); 
     hook(tmp); 
     return tmp; 
    }; 
    prompt.restore = function() { prompt = old_prompt; } 
    // analogous for other functions you want to replace 
})(); 

envolviéndolo en una función (autoejecutable) asegura que old_prompt no se escape al exterior. Sin embargo, necesita exponer algo. Elegí proporcionar una función de restauración, por conveniencia y, tal vez, podría decirse, a prueba de futuro y encapsulación. Siempre y cuando las funciones de orden superior se abstengan de juguetear con el alcance de otra persona ...

Además, no, (supongo) no es posible restablecer el valor anterior de una variable sin referencia alguna (el valor anterior)), incluso si ese valor pasó a ser un built-in. Incluso si fuera posible, sería un truco bastante oscuro, de esta manera funciona, así que sigamos con eso.

(Crédito para func.restore va a Martijn)

+0

En una nota lateral, he visto este truco más comúnmente en Lua (donde es incluso más fácil gracias al bloque 'do ... end' - tiene su propio alcance pero se ejecuta instantáneamente y una vez, por lo que termina siendo simplemente más que una función autoejecutable de aspecto más agradable). – delnan

+0

Incluso podría asignar 'restore_funcs' a la función (nueva)' prompt', guardando otra variable global: 'prompt.restore = function() {prompt = old_prompt; } ' Para restaurar el prompt original, simplemente haga' prompt.restore() '. – Martijn

+0

@Martijn: ¡Muy buena idea! – delnan

Cuestiones relacionadas