Javascript函数挂钩

Sey*_*yen 12 javascript hook aop

编辑:好的,我相信以下解决方案是有效的:

  1. 使用jQuery AOP插件.它基本上将旧函数与钩子一起包装到函数三明治中,并将其重新分配给旧函数名称.这会导致函数与每个新添加的钩子嵌套.
    如果jQuery不适合你,只需掠夺源代码,插件中似乎没有任何jQuery依赖项,而且源代码简单而且非常小.

  2. 有一个描述所有钩子及其目标的对象,以及一个用于存储初始未修改函数的对象.添加新钩子时,包装将在原始函数周围重做,而不是重新包装前一个包装函数.
    您可以转义嵌套函数,并获取两个要处理的对象.潜在地,如果您经常添加/删除挂钩并且无序,这也可能意味着更容易进行挂钩处理.

我会选择第一个,因为它已经完成了,我没有表现可担心.由于原始函数不受影响,即使我切换挂钩方​​法,我也只需要重做挂钩添加,这可能只是一些简单的搜索和替换操作.


嗨,

是否有可能创建一种机制,其中函数A可能有一组钩子(将在函数A之前/之后执行的函数)?

理想情况下,函数A不会知道挂钩功能,因此我不必修改函数A的源代码来调用挂钩.就像是:

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!"
Run Code Online (Sandbox Code Playgroud)

我一直试图破解一些小时,但到目前为止还没有运气.

Gre*_*reg 12

可能不漂亮,但似乎工作......

<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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我考虑过这个,它有效,但是你可以用这个方法嵌套,因为每个新的钩子都包装了所有以前的钩子: hookC(hookB(hookA(functionA.apply(this,arguments)))) 我不确定是否这会以任何方式影响性能,但感觉不正确/不安全。是否使用了“parent”,以便正确绑定“apply(this,arguments)”中的 this ? (2认同)

Tra*_*sen 10

看看jQuery的AOP插件.一般来说,谷歌"面向javascript方面编程".

  • jQuery!= Javascript.例如,如果你是在Facebook平台上编程,也可能是其他"沙盒"环境. (4认同)