decorador de python con javascript
Frecuentes
Visto 1,682 veces
8
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?
2 Respuestas
10
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:
Le permite proporcionar la devolución de llamada como un argumento a una central
decorate
función.Le permite proporcionar opcionalmente un "contexto" (
this
valor) para usar al llamar a la devolución de llamada.Conserva el valor de
this
al llamar al original y (si no proporcionacontext
) 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
3
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 javascript decorator or haz tu propia pregunta.
En realidad, funciona así: Natim