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()">
源文:三生石上