AOP in JavaScript,转贴 总结

今天查看了一下AOP在JavaScript中的实现,个人感觉三生石上的实现较好,简单记录一下:
var aspect = { 
    before: function(context, targetName, fn) {
        var target = context[targetName];
        context[targetName] = function() {
            return target.apply(context, fn.apply(context, arguments));
        };
    }, 
    after: function(context, targetName, fn) {
        var target = context[targetName];
        context[targetName] = function() {
            return fn.apply(context, target.apply(context, arguments));
        };
    }
};

使用方法1):拦截函数并修改参数

function hello() {
    for (var i = 0; i < arguments.length; i++) {
        arguments[i] += "[hello]";
    }
    return arguments;
}
aspect.before(window, 'hello', function() {
    for (var i = 0; i < arguments.length; i++) {
        arguments[i] += "[before]";
    }
    return arguments;
}); 
aspect.after(window, 'hello', function() {
    for (var i = 0; i < arguments.length; i++) {
        arguments[i] += "[after]";
    }
    return arguments;
}); 
var args = hello('World', 'JavaScript');
console.log(Array.prototype.join.apply(args, [' ']));

使用方法2):拦截按钮事件

function voice(){
  alert("救命啊!");
}
aspect.after(window,'voice',function(){alert("help");})

<input type="button" >

源文:三生石上

另附:司徒正美, Aop.js