Как изменить (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;