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

浙公网安备 33010602011771号