如何在特定行修改(猴子补丁)第三方功能
How to modify (monkey-patching) third-party function at specific line
我想知道是否可以通过在这些函数中间添加几行的方式来修改第三方函数(如猴子修补 [wiki], [nice article])?
我想要的示例:
第三方(修补目标):
var obj = {
sum: function (a) {
var b = 1;
//Here I want to add a line:
// b = 2
return a + b;
}
};
N.B.: 我知道我们可以执行自定义函数 before 和 after 原始函数调用,但我想要在原始函数主体的中间执行自定义代码。
UPD: 我将在下面分享我的想法作为答案,但它很难看所以我想找到其他方法。
这样做有点丑陋。我没有很好地测试它,但它应该可以工作:
// 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;
我想知道是否可以通过在这些函数中间添加几行的方式来修改第三方函数(如猴子修补 [wiki], [nice article])?
我想要的示例:
第三方(修补目标):
var obj = {
sum: function (a) {
var b = 1;
//Here I want to add a line:
// b = 2
return a + b;
}
};
N.B.: 我知道我们可以执行自定义函数 before 和 after 原始函数调用,但我想要在原始函数主体的中间执行自定义代码。
UPD: 我将在下面分享我的想法作为答案,但它很难看所以我想找到其他方法。
这样做有点丑陋。我没有很好地测试它,但它应该可以工作:
// 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;