Javascript 函数 Hook

标签 javascript aop hook

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

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

  2. 有一个描述所有钩子(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/

相关文章:

django - 服务器 : respond to collectstatic with "yes" 上的自动 django 接收 Hook

jquery - 从 javascript 包含 javascript 库的标准方法

javascript - 如何使用热键打开多个链接?

.net - 包含特定于环境的设置的配置文件

php - WordPress 删除操作不起作用

android - 在android上挂起/ sleep 之前和之后执行脚本

javascript - Jquery .html 替换器只是清空了我的选择器,出了什么问题?

javascript - Angular 2 - 如何在标题中编写 Http get promise?

java - 方面和方法之间有什么区别? [AOP]

java - 如何使用 AspectJ 在字段上声明警告