Как изменить (monkey-patching) стороннюю функцию в конкретной строке

Интересно, можно ли изменить стороннюю функцию (например, monkey-patching [ wiki], [ nice article]) таким образом, чтобы добавить несколько строк в середине этих функций?

Пример того, что я хочу:

Сторонний (исправление цели):

var obj = {
  sum: function (a) {
    var b = 1;
    //Here I want to add a line:
    // b = 2
    return a + b;
  }
};

NB: я знаю, что мы можем выполнять пользовательские функции до и после вызова исходной функции, но я хочу выполнить пользовательский код в середине тела исходной функции.

UPD: Ниже я поделюсь своими мыслями в качестве ответа, но это уродливо, поэтому я хочу найти другие способы.

1 ответ

Решение

Это немного уродливый способ сделать это. Я не проверял это хорошо, но это должно работать:

    // Split function into array of strings
    var arr = obj.sum.toString().split('\n');
    // Insert our expression (b = 2) at "line 2"
    arr.splice(2, 0, "b = 2");
    // Remove first line: "function (a) {" (to be honest we should first parse and remember args)
    arr.splice(0, 1)
    //Remove last line: "}"
    arr.splice(arr.length-1, 1)
    // Create a string with our function
    var str  = arr.join("\n")
    //Create function with new Function()
    var newFunc = new Function("a", str); //a -is our argument for "sum" func
    obj.sum = newFunc;
Другие вопросы по тегам