在这段代码中,我创建了一个名为someFunction的函数。然后我修改了Function.prototype.apply和call方法。因此,我的函数代码没有工作,而是运行了拦截代码(显示了一个警报)。但是“call”和“apply”都没有拦截直接的方法调用。有可能拦截这个吗?
Function.prototype.call = function(){alert("call");};
Function.prototype.apply = function(){alert("apply");};
function someFunction(){}
window.onload = function(){
someFunction.call(this); //call alert is shown
someFunction.apply(this); //apply alert is shown
someFunction(); //how can I intercept this?
}
6条答案
按热度按时间k7fdbhmy1#
你只能通过设置另一个函数来覆盖一个已知的函数(例如,你不能拦截所有的函数调用):
请注意,如果
someFunction
在被此代码更改之前已经被另一个脚本别名化/引用,则这些引用仍将指向未被替换函数覆盖的原始函数。mctunoxg2#
值得注意的是,在较新版本的JS中,有
Proxy
对象可以使用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxylaik7k3q3#
您有机会拦截直接函数调用。这需要:
如果以上两个条件都不满足,拦截直接调用的唯一方法就是 Package 目标函数,这是AndyE https://stackoverflow.com/a/3406523/1316480提供的解决方案
对于由函数文本创建并隐藏在私有作用域中的函数,无法拦截对其的直接调用。
我有一篇博客文章总结了所有这些:http://nealxyc.wordpress.com/2013/11/25/intercepting-javascript-function/
mlnl4t2r4#
您可以遍历全局作用域,并替换您发现的任何不属于“您的”函数类型的对象。
bqujaahr5#
太棒了,喜欢它:)
j2qf4p5b6#
您可以使用Proxy来实现这一点。
首先定义一个带有
apply
陷阱的处理程序,该陷阱用于拦截对函数的调用。然后,使用该处理程序,将函数设置为自身的代理。示例: