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" id="btn" value="动我就叫人来" onclick="voice()">
源文:三生石上
另附:司徒正美Aop.js
posted @ 2011-03-04 13:33  李传涛  阅读(1460)  评论(0编辑  收藏  举报