有一些javascript代码,例如
function hello() {
}
function world() {
}
我想向它们添加一些日志记录代码,但我不想修改代码。我希望我可以在另一个文件中编写一些代码,它会在运行时修改函数。有可能做到这一点吗?
更新
感谢您的两个答案,但我必须让这个问题更清楚。
和函数只是一些示例hello,world实际上文件中有数百个函数,它是手动重新定义它们的实现。
我正在寻找一种自动执行此操作的方法(类似于 java 中的 AspectJ)。
有一些javascript代码,例如
function hello() {
}
function world() {
}
我想向它们添加一些日志记录代码,但我不想修改代码。我希望我可以在另一个文件中编写一些代码,它会在运行时修改函数。有可能做到这一点吗?
更新
感谢您的两个答案,但我必须让这个问题更清楚。
和函数只是一些示例hello,world实际上文件中有数百个函数,它是手动重新定义它们的实现。
我正在寻找一种自动执行此操作的方法(类似于 java 中的 AspectJ)。
您不能修改函数,但可以包装它们并用包装器替换函数。
这样(见现场演示):
function logFactory(func, message) {
return function () {
console.log(message);
return func.apply(this, arguments);
}
}
hello = logFactory(hello, "Some log message");
这不会让您在函数操作时获取任何数据,也不会更改函数内部发生的事情(尽管您可以捕获参数并在传递它们之前修改它们,并且您可以捕获返回值并修改它退还之前)。
你总是可以使用另一个函数名并调用你想要“扩展”的函数
function extendSomefunction(param) {
somefunction(param);
// additional things here
}
但是你可以在这里找到另一个技巧
复制代码:
var origParseFloat = parseFloat;
parseFloat = function(str) {
alert("And I'm in your floats!");
return origParseFloat(str);
}
除了将函数包装在新版本中之外,您唯一的其他选择是在 JavaScript 文件离开您的服务器之前对其进行修改。手动,作为构建步骤,或通过 HttpHandler 动态进行。这是最强大的解决方案,因为它还捕获了在运行时未公开给您包装的私有函数和私有引用。但是,它需要大量的工作,所以如果上面的简单函数包装答案就足够了,我衷心推荐它!
您可以包装函数并用包装器替换它:
var originalHello;
originalHello = hello;
hello = function () {
// log your stuff
console.log('fired before original hello is triggered');
// call original hello with the current scope & arguments
originalHello.apply(this, arguments);
}