javascript - 用于 Javascript 的 Ruby 风格 before() 和 after() 过滤器

标签 javascript

有没有办法在 Javascript 函数调用之前和之后添加?我有这样的东西:

var A = {

  a1: function () {

  },
};

var B = {

  b1: function () {

  }
};

A.a1();
B.b1();
//so on .. 

我需要在每种方法之前和之后发生一些事情。我可以只制作那些前后函数并分别调用它们,但我必须在代码中经常这样做并且不想重复自己。

更新: 在 ruby 中

before_filter :some_function
after_filter  :some_other_function

将在该类中的每个函数调用之前执行 some_function,并在每次函数调用之后执行 some_other_function。这在 Rails 的应用程序 Controller 中也找不到。

最佳答案

您可以编写一个函数来枚举对象的字段并将其函数包装在新的函数中:

function addBefore(obj, func) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] === 'function') {
            (function () {
                var oldFunc = obj[prop];
                obj[prop] = function () {
                    func.apply(obj, arguments);
                    return oldFunc.apply(obj, arguments);               
                }
            }());
        }
    }
}
var A = {

  a1: function (a, b) {
    alert('A.a1');
    return a + b;
  },
  a2: function (a, b) {
    alert('A.a2');
    return a + b;
  }
};
addBefore(A, function (a, b) {
    alert('before ' + a + ', ' + b);
});
A.a1(1, 2);
A.a2(3, 4);

以类似的方式,您可以编写一个函数 addAfter,只需将两个调用切换到 apply() 函数即可。

关于javascript - 用于 Javascript 的 Ruby 风格 before() 和 after() 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17731710/

相关文章:

Javascript 时间同步

javascript - 在不同的 select 中使用相同的 javascript 函数

javascript - 无法在 Canvas 上绘图。可能是什么问题?

javascript - 使用 z-index 将 div 中的子元素发送到背景,但仍然使它们可见

javascript - 如何使用 js/css 禁用特定类的 </td> 选择?

javascript - 流(类型)不尊重我对类属性所做的手动检查

javascript - JSLint 错误 : "unnecessary else after disruption"

javascript - 如何使用客户端的凭据从 Node 后端查询 firebase

javascript - 复制 Bootstraps 主导航和子导航

javascript - 什么操作可以导致 HTML FORM 元素提交?