编辑:好的,我相信以下解决方案是有效的:
使用 jQuery AOP 插件。它基本上将旧函数与钩子(Hook)一起包装成一个函数三明治,并将其重新分配给旧函数名称。这会导致函数与每个新添加的 Hook 嵌套。
如果jQuery不适合你,就直接掠夺源代码,插件中似乎没有任何jQuery依赖,而且源代码很简单而且很小。有一个描述所有钩子(Hook)及其目标的对象,还有一个用于存储初始未修改函数的对象。添加新的钩子(Hook)时,将围绕原始函数重做包装,而不是重新包装之前的包装函数。
您转义嵌套函数,取而代之的是处理两个对象。如果您经常无序地添加/删除钩子(Hook),这也可能意味着更容易处理钩子(Hook)。
我会选择第一个,因为它已经完成,而且我不需要担心性能。而且由于不影响原有的功能,即使切换 Hook 方式,也只需要重新添加 Hook 即可,可能只是一些简单的查找替换操作。
你好,
是否可以创建一种机制,其中函数 A 可能有一组钩子(Hook)(将在函数 A 之前/之后执行的函数)?
理想情况下,函数 A 不会知道 Hook 功能,这样我就不必修改函数 A 的源代码来调用 Hook 。像这样的东西:
A = function(){
alert("I'm a naive function");
};
B = function(){
alert("I'm having a piggyback ride on function A!"+
"And the fool doesn't even know it!");
};
addHook(B, A)//add hook B to function A
A()
//getting alerts "I'm a naive function"/"I'm having a
//piggyback ride on function A! And the fool doesn't even know it!"
几个小时以来,我一直在尝试破解一些东西,但到目前为止还没有成功。
最佳答案
可能不漂亮,但它似乎工作...
<script>
function A(x) { alert(x); return x; }
function B() { alert(123); }
function addHook(functionB, functionA, parent)
{
if (typeof parent == 'undefined')
parent = window;
for (var i in parent)
{
if (parent[i] === functionA)
{
parent[i] = function()
{
functionB();
return functionA.apply(this, arguments)
}
break;
}
}
}
addHook(B, A);
A(2);
</script>
关于Javascript 函数 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/789630/