decorador de python con javascript

Lo que quiero hacer es lo siguiente:

Tengo una función que alerta algo:

myfunction = function(foobar) { 
                 alert(foobar); 
             };

Ahora quiero decorarlo para que:

decorate = function(callback) { 
              return function(foobar) { 
                  callback(foobar); 
                  console.log(foobar); 
           }; 
};

Entonces puedo escribir:

myfunction = decorate(myfunction);

Y luego myfunction hará el inicio de sesión normal + en la consola.

¿Cómo puedo hacer que funcione con Javascript?

preguntado el 03 de mayo de 12 a las 16:05

En realidad, funciona así:

2 Respuestas

Sí tu puedes. Y de hecho, tienes, tu implementación funciona perfectamente: Ejemplo vivo | fuente

var myfunction = function(foobar) { alert(foobar); };

var decorate = function(callback) { return function(foobar) { callback(foobar); console.log(foobar); }; };

var result = decorate(myfunction);

result("Hi there");

Recomendaría usar la función declaraciones en lugar de función expresiones, aunque:

function myfunction(foobar) {
    alert(foobar);
}

function decorate(callback) {
    return function(foobar) {
        callback(foobar);
        console.log(foobar);
    };
}

var result = decorate(myfunction);

result("Hi there");

Y si desea crear una versión más genérica, considere usar apply (DND | especulación) y el arguments pseudo-matriz (DND | especulación): Ejemplo vivo | fuente

function decorate(original, wrapper, context) {
    return function() {
        try {
            original.apply(this, arguments);
        }
        catch (e) {
        }
        try {
            wrapper.apply(context || this, arguments);
        }
        catch (e) {
        }
    };
}

function myFunction(arg1, arg2) {
    alert("arg1 = " + arg1 + ", arg2 = " + arg2);
}

var newFunction = decorate(myFunction, function(arg1, arg2) {
    console.log("arg1 = " + arg1 + ", arg2 = " + arg2);
});

newFunction(1, 2);

Esa versión hace un par de cosas:

  1. Le permite proporcionar la devolución de llamada como un argumento a una central decorate función.

  2. Le permite proporcionar opcionalmente un "contexto" (this valor) para usar al llamar a la devolución de llamada.

  3. Conserva el valor de this al llamar al original y (si no proporciona context) la devolución de llamada.

...que puede ser útil al decorar funciones de objetos (a veces llamados métodos).

contestado el 03 de mayo de 12 a las 17:05

Usualmente uso la declaración de función, pero en ese caso la función se define en una matriz (es para statusCode en $.ajax()). Me encantaría ver una versión genérica. - natim

@Natim: Curiosamente, acabo de agregar uno. :-)- TJ Crowder

La cuestión es que a veces se puede llamar al contenedor antes de la devolución de llamada y, a veces, después. Pero su implementación es interesante. - natim

@Natim: Fácilmente podría tener el decorate función aceptar un objeto con claves como before y after que se refieren a las funciones a llamar (cualquiera de ellas es opcional, por supuesto, y presumiblemente con beforeContext y afterContext también). - TJ Crowder

Más genérico usando argumentos y aplicar:

function myfunction(foobar) { 
    alert(foobar); 
}

function decorate(callback) { 
    return function() { 
        callback.apply(null, arguments); 
        console.log(arguments); 
    }; 
}

var result = decorate(myfunction);

result("Hi there");

contestado el 03 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.