Tengo una función, a()
que quiero anular, pero también tengo que realizar el original a()
en un orden dependiendo del contexto. Por ejemplo, a veces, cuando estoy generando una página, quiero anular así:
function a() {
new_code();
original_a();
}
y a veces así:
function a() {
original_a();
other_new_code();
}
¿Cómo consigo eso original_a()
desde dentro de la anulación a()
? ¿Es posible?
Por favor, no sugiera alternativas para anular de esta manera, conozco muchas. Estoy preguntando sobre esta manera específicamente.
(functi..
y})
. Hacerlo}();
produciría el mismo resultado, ya que(function{})()
se utiliza el primer conjunto de paréntesis porque no puede simplemente declarar, anónimo, la expresión de función que tiene que asignarle. Pero al hacer () no estás definiendo nada, solo devolviendo una función.a
, no llamándola y almacenando el valor de retorno. Los paréntesis me dejan saber que algo más está sucediendo.El patrón Proxy podría ayudarte:
fuente
Gracias a todos, el patrón proxy realmente ayudó ... En realidad, quería llamar a una función global foo ... En ciertas páginas necesito hacer algunas comprobaciones. Entonces hice lo siguiente.
Gracias, esto realmente me ayudó
fuente
org_foo(args)
, llameorg_foo.call(this, args)
. Eso se mantienethis
como hubiera sido cuando window.foo llama normalmente (no proxy). Ver esta respuestaPuede anular una función usando una construcción como:
Por ejemplo:
Editar: se corrigió un error tipográfico.
fuente
Pasar argumentos arbitrarios:
fuente
original_a
aunque no se refieren argumentos ?La respuesta que proporciona @Matthew Crumley es hacer uso de las expresiones de función invocadas inmediatamente, para cerrar la función 'a' anterior en el contexto de ejecución de la función devuelta. Creo que esta fue la mejor respuesta, pero personalmente, preferiría pasar la función 'a' como argumento a IIFE. Creo que es más comprensible.
fuente
Los ejemplos anteriores no se aplican
this
o pasanarguments
correctamente a la función de anulación. El subrayado _.wrap () ajusta las funciones existentes, aplicathis
y pasaarguments
correctamente. Ver: http://underscorejs.org/#wrapfuente
Tenía otro código escrito por otra persona y quería agregar una línea a una función que no pude encontrar en el código. Entonces, como solución, quería anularlo.
Sin embargo, ninguna de las soluciones funcionó para mí.
Esto es lo que funcionó en mi caso:
fuente
He creado un pequeño ayudante para un escenario similar porque a menudo necesitaba anular funciones de varias bibliotecas. Este asistente acepta un "espacio de nombres" (el contenedor de funciones), el nombre de la función y la función de anulación. Reemplazará la función original en el espacio de nombres referido con la nueva.
La nueva función acepta la función original como primer argumento y los argumentos de las funciones originales como el resto. Preservará el contexto cada vez. También admite funciones nulas y no nulas.
Uso, por ejemplo, con Bootstrap:
Sin embargo, no creé ninguna prueba de rendimiento. Posiblemente puede agregar una sobrecarga no deseada que puede o no ser un gran problema, dependiendo de los escenarios.
fuente
En mi opinión, las respuestas principales no son legibles / mantenibles, y las otras respuestas no vinculan adecuadamente el contexto. Aquí hay una solución legible que usa la sintaxis ES6 para resolver estos dos problemas.
fuente
Entonces mi respuesta terminó siendo una solución que me permite usar la variable _esta variable apuntando al objeto original. Creo una nueva instancia de un "Cuadrado", pero odiaba la forma en que el "Cuadrado" generaba su tamaño. Pensé que debería seguir mis necesidades específicas. Sin embargo, para hacerlo, necesitaba que el cuadrado tuviera una función "GetSize" actualizada con las funciones internas de esa función que llama a otras funciones que ya existen en el cuadrado, como this.height, this.GetVolume (). Pero para hacerlo, necesitaba hacerlo sin ningún truco loco. Entonces aquí está mi solución.
Alguna otra inicializador de objetos o función auxiliar.
Función en el otro objeto.
fuente
No estoy seguro de si funcionará en todas las circunstancias, pero en nuestro caso, intentamos anular la
describe
función en Jest para poder analizar el nombre y omitir todo eldescribe
bloque si cumple con algunos criterios.Esto es lo que funcionó para nosotros:
Dos cosas que son críticas aquí:
No usamos una función de flecha
() =>
.Las funciones de flecha cambian la referencia a
this
y necesitamos que sea el archivothis
.El uso de
this.describe
y enthis.describe.skip
lugar de justdescribe
ydescribe.skip
.Una vez más, no estoy seguro de que sea valioso para nadie, pero originalmente intentamos escapar con la excelente respuesta de Matthew Crumley, pero necesitábamos hacer que nuestro método funcionara y aceptar parámetros para analizarlos en condicional.
fuente