在javascript中拦截函数调用

在javascript中拦截函数调用,javascript,proxy,hook,function-composition,modifier,Javascript,Proxy,Hook,Function Composition,Modifier,如果有人能告诉我如何在javascript中拦截函数调用,我将不胜感激。 我知道使用代理是可能的 例如,我尝试了下面的代码来截取它,但现在我想截取toDataURL()。为了调用toDataURL,您需要首先创建一个canvas元素。因此,现在我想知道如何定义一个代理来拦截toDataURL() 截取它的示例代码: window.x = 0; let calls = (function(){ let canvas = document.createElement('can

如果有人能告诉我如何在javascript中拦截函数调用,我将不胜感激。 我知道使用代理是可能的

例如,我尝试了下面的代码来截取它,但现在我想截取
toDataURL()
。为了调用toDataURL,您需要首先创建一个canvas元素。因此,现在我想知道如何定义一个代理来拦截
toDataURL()

截取它的示例代码:

window.x = 0;
    let calls = (function(){
        let canvas = document.createElement('canvas');
        let fun = canvas.toDataURL;
        canvas.toDataURL = function(){       
            window.x++;         
            return fun.apply(document, arguments);
        }
        return ()=>calls;
    })();

尽管修改标准类型的标准方法总是有很好的理由,但JS中修改方法的基本方法是包装。人们甚至可以考虑标准化
Function.prototype[前后前后前后前后]
。然后,修改任何给定的方法或函数将与下面提供的示例一样简单,这也可能是OP正在寻找的答案

(函数(函数){
变量
isFunction=函数(类型){
返回(
(typeof type==“函数”)
&&(typeof type.call==“函数”)
&&(typeof type.apply==“函数”)
);
},
getSanitizedTarget=函数(目标){
返回((target!=null)&&target)| null;
};
Function.prototype.before=函数(处理程序,目标){//before
目标=getSanitizedTarget(目标);
var继续=这个;
返回(isFunction(处理程序)和isFunction(继续)和函数(){
var args=参数;
调用((target | | this),args);
返回继续。应用((目标| |此),args);
})| |继续;
};
Function.prototype.after=函数(处理程序,目标){//afterReturning
目标=getSanitizedTarget(目标);
var继续=这个;
返回(isFunction(处理程序)和isFunction(继续)和函数(){
var ret,args=参数;
ret=继续。应用((目标| |此),args);
call((target | | this)、ret、args);
返回ret;
})| |继续;
};
Function.prototype.around=函数(处理程序,目标){//around
目标=getSanitizedTarget(目标);
var继续=这个;
返回(isFunction(处理程序)和isFunction(继续)和函数(){
return handler.call((target | | this),procedure,handler,arguments);
})| |继续;
};
}(功能);
函数modifyCanVastODataurafter(返回值,thisArgs){
log('modifycanvastodautaullafter::thisArgs:',thisArgs');
log('modifycanvastodautaullafter::returnValue:',returnValue);
}
HTMLCanvasElement.prototype.toDataURL=HTMLCanvasElement.prototype.toDataURL.after(ModifyCanVastODataurafter);
var elmToJpgLow=document.getElementById('canvasToLowResolutionJpg');
var elmToJpgMedium=document.getElementById('canvasToMediumResolutionJpg');
log(“elmToJpgLow.toDataURL('image/jpeg',0.1):”,elmToJpgLow.toDataURL('image/jpeg',0.1));
log('elmToJpgLow.toDataURL:',elmToJpgLow.toDataURL);
log(“elmToJpgMedium.toDataURL('image/jpeg',0.1):”,elmToJpgMedium.toDataURL('image/jpeg',0.5));
log('elmToJpgMedium.toDataURL:',elmToJpgMedium.toDataURL)
。作为控制台包装{最大高度:100%!重要;顶部:0;}


在我看来,您似乎已经修改了
canvas.toDataURL
,而不是您所说的
document.createElement
。我只是想知道
return()=>调用了什么用于,在生活中。此外,这种方法也不是通用的;它精确地修改所创建元素的方法。你可以尝试修改
htmlcanvaseelement.prototype.toDataURL
。您好,我尝试了上面的代码,但没有成功。你能举个例子吗?试一下事件,比intercepting@Bathooman ... 现在有两种方法。。。一个基于方法修改/功能组合,另一个基于代理。每个都通过示例代码来证明自己。感谢您的回复peter,您知道我实际上要做的是在调用
canvas.toDataURL()
时引起注意。看来我不能用你提出的方法来实现这一点。我已经使用下面的代码为
document.createElement
做了这件事:
let calls=(function(){let fun=document.createElement;document.createElement=function(){window.doc.push(参数);return fun.apply(document,参数);}return()=>calls;}();@Bathooman。。。不客气。请描述一下,这两种方法中哪些不适合你。所有给定的示例都提供了运行代码。因此,人们应该能够更容易地理解每种方法是如何运作的。另一方面,我没有得到Q中提供的代码(见我的评论)以及您上面评论中的代码想要实现的目标。我不知道您期望它做什么,在哪里,为什么,以及它失败的错误消息。提供更大的图片会更有帮助。亲爱的peter,我只想在调用canvas.toDataURL()时得到通知。我真的不知道该怎么办。请帮忙!!document.createElement可以被以下命令覆盖:
var origParseFloat=parseFloat;parseFloat=function(str){alert(“我在你的浮动中!”);return origParseFloat(str);}
@Bathooman。。。请首先在3月7日11:08回复评论。。。任何进一步的回答尝试都只是猜测,只要不知道代码的哪一部分调用了canvas.toDataURL()
,以及哪一部分必须截取或需要通知它。我3月6日10:38的答案提供了两种不同的方法,每种方法都提供了工作示例代码。你试了什么?你被困在哪里了?