Programowe Dodawanie kodu do funkcji javascript
Próbuję dostosować istniejącą bibliotekę JS bez modyfikowania oryginalnego kodu JS. Ten kod ładuje się w kilku zewnętrznych plikach JS, do których mam dostęp, a to, co chciałbym zrobić, to zmienić jedną z funkcji zawartych w oryginalnym pliku bez kopiowania i wklejania całości do drugiego pliku JS.
Na przykład, off limits JS może mieć taką funkcję:
var someFunction = function(){
alert("done");
}
Chciałbym móc w jakiś sposób dołączyć lub dołączyć kod JS do tej funkcji. Powodem jest przede wszystkim to, że w oryginalnym nietykalnym JS funkcja jest dość Ogromna i jeśli ten JS kiedykolwiek zostanie zaktualizowany, funkcja, którą go nadpisuję, będzie nieaktualna.
Nie jestem pewien, czy to możliwe, ale pomyślałem, że sprawdzę.5 answers
Jeśli {[2] } jest globalnie dostępna, możesz buforować funkcję, utworzyć własną i wywołać ją.
Więc jeśli to jest oryginał...someFunction = function() {
alert("done");
}
Zrobiłbyś to...
someFunction = (function() {
var cached_function = someFunction;
return function() {
// your code
var result = cached_function.apply(this, arguments); // use .apply() to call it
// more of your code
return result;
};
})();
Zauważ, że używam .apply
do wywołania funkcji buforowanej. To pozwala mi zachować wartość oczekiwaną this
i przekazać argumenty, które zostały przekazane jako argumenty Indywidualne, niezależnie od tego, ile ich było.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-29 15:59:25
Najpierw zapisz rzeczywistą funkcję w zmiennej..
var oldFunction = someFunction;
Następnie zdefiniuj własne:
someFunction = function(){
// do something before
oldFunction();
// do something after
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-03 20:00:01
Możesz utworzyć funkcję, która wywoła Twój kod, a następnie wywołuje funkcję.
var old_someFunction = someFunction;
someFunction = function(){
alert('Hello');
old_someFunction();
alert('Goodbye');
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-03 20:00:19
Nie wiem, czy możesz zaktualizować funkcję, ale w zależności od tego, jak się do niej odwołuje, możesz utworzyć nową funkcję w jej miejsce:
var the_old_function = someFunction;
someFunction = function () {
/* ..My new code... */
the_old_function();
/* ..More of my new code.. */
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-03 20:01:13
Również. Jeśli chcesz zmienić kontekst lokalny, musisz odtworzyć funkcję. Na przykład:
var t = function() {
var a = 1;
};
var z = function() {
console.log(a);
};
Teraz
z() // => log: undefined
Then
var ts = t.toString(),
zs = z.toString();
ts = ts.slice(ts.indexOf("{") + 1, ts.lastIndexOf("}"));
zs = zs.slice(zs.indexOf("{") + 1, zs.lastIndexOf("}"));
var z = new Function(ts + "\n" + zs);
I
z() // => log: 1
Ale to tylko najprostszy przykład. Obsługa argumentów, komentarzy i zwracanych wartości wymaga jeszcze dużo pracy. Ponadto nadal istnieje wiele pułapek.toString | slice | indexOf | lastIndexOf | nowa funkcja
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-18 23:46:34