Estoy intentando personalizar una biblioteca JS existente sin modificar el código JS original. Este código se carga en algunos archivos JS externos a los que tengo acceso, y lo que me gustaría hacer es cambiar una de las funciones contenidas en el archivo original sin copiar y pegar todo en el segundo archivo JS.
Entonces, por ejemplo, el JS fuera de los límites podría tener una función como esta:
var someFunction = function(){
alert("done");
}
Me gustaría poder agregar o anteponer algún código JS en esa función de alguna manera. La razón es principalmente que en el JS intocable original la función es bastante enorme y si ese JS alguna vez se actualiza, la función con la que lo sobrescribo estará desactualizada.
No estoy del todo seguro de que esto sea posible, pero pensé que lo comprobaría.
fuente
Respuestas:
Si
someFunction
está disponible globalmente, puede almacenar en caché la función, crear la suya propia y hacer que la suya la llame.Entonces, si este es el original ...
Harías esto ...
Aquí está el violín
Tenga en cuenta que utilizo
.apply
para llamar a la función en caché. Esto me permite retener el valor esperado dethis
y pasar los argumentos que se pasaron como argumentos individuales, independientemente de cuántos haya.fuente
apply
: esta es la única respuesta que realmente resuelve el problema.funciton
palabra clave de JavaScript ? ;) Gracias por la edición.apply()
. Pero si fuera un objeto similar a una matriz como un objeto jQuery, por ejemplo, entonces sí, algunos navegadores arrojarían un errorprimero almacene la función real en una variable.
luego define el tuyo:
fuente
apply
para llamarlo. Vea la respuesta de am.someFunction
conwindow.someFunction
el código de seguridad. La razón es que mi función se declaró dentro de un$(document).ready()
controlador jquery .Puede crear una función que llame a su código y luego llame a la función.
fuente
No sé si puede actualizar la función, pero dependiendo de cómo se haga referencia, puede crear una nueva función en su lugar:
fuente
También. Si desea cambiar el contexto local, debe volver a crear la función. Por ejemplo:
Ahora
Luego
Y
Pero este es solo el ejemplo más simple. Todavía se necesitará mucho trabajo para manejar argumentos, comentarios y valor de retorno. Además, todavía existen muchos escollos.
toString | rebanada | indexOf | lastIndexOf | nueva función
fuente
El patrón de proxy (utilizado por el usuario1106925) se puede poner dentro de una función. El que escribí a continuación funciona en funciones que no están en el alcance global, e incluso en prototipos. Lo usarías así:
En el fragmento de abajo, puedes verme usando la función para extender test.prototype.doIt ().
fuente