有没有办法通过在某个地方注册一个全局钩子(也就是说,不修改实际的函数本身)或通过一些其他方法来使任何函数在被调用时输出一条console.log语句?
发布于 2011-02-18 05:06:28
下面是用您选择的函数扩充全局名称空间中所有函数的方法:
function augment(withFn) {
var name, fn;
for (name in window) {
fn = window[name];
if (typeof fn === 'function') {
window[name] = (function(name, fn) {
var args = arguments;
return function() {
withFn.apply(this, args);
return fn.apply(this, arguments);
}
})(name, fn);
}
}
}
augment(function(name, fn) {
console.log("calling " + name);
});
一个缺点是,在调用augment
之后创建的任何函数都不会有额外的行为。
发布于 2019-08-13 03:47:09
对我来说,这看起来是最优雅的解决方案:
(function() {
var call = Function.prototype.call;
Function.prototype.call = function() {
console.log(this, arguments); // Here you can do whatever actions you want
return call.apply(this, arguments);
};
}());
发布于 2016-07-26 13:10:54
如果需要更有针对性的日志记录,下面的代码将记录特定对象的函数调用。您甚至可以修改对象原型,以便所有新实例也都获得日志记录。我使用Object.getOwnPropertyNames而不是for...in,因此它适用于ECMAScript 6类,这些类没有可枚举的方法。
function inject(obj, beforeFn) {
for (let propName of Object.getOwnPropertyNames(obj)) {
let prop = obj[propName];
if (Object.prototype.toString.call(prop) === '[object Function]') {
obj[propName] = (function(fnName) {
return function() {
beforeFn.call(this, fnName, arguments);
return prop.apply(this, arguments);
}
})(propName);
}
}
}
function logFnCall(name, args) {
let s = name + '(';
for (let i = 0; i < args.length; i++) {
if (i > 0)
s += ', ';
s += String(args[i]);
}
s += ')';
console.log(s);
}
inject(Foo.prototype, logFnCall);
https://stackoverflow.com/questions/5033836
复制相似问题