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ę.
Author: Cœur, 2012-02-03

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;
    };
})();

Oto skrzypce


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.

 198
Author: 5 revs, 5 users 63%user1106925,
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
};
 28
Author: ggreiner,
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');
}
 9
Author: Rocket Hazmat,
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.. */
}
 6
Author: Ned Batchelder,
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
 3
Author: Ivan Black,
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