欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript AOP 使用

程序员文章站 2022-07-06 12:42:29
出处:https://www.cnblogs.com/zengyuanjun/p/7429968.html /** * @desc 面向aop编程 * @param {Function} originFunc - 源方法 * @param {Function} before - 在源代码执行之前的方 ......
出处:https://www.cnblogs.com/zengyuanjun/p/7429968.html


/** * @desc 面向aop编程 * @param {function} originfunc - 源方法 * @param {function} before - 在源代码执行之前的方法体 * @param {function} after - 在源代码执行之后的方法体 */ function constructor(originfunc, before, after) { return function() { before.apply(this, arguments); originfunc.apply(this, arguments); after.apply(this, arguments); } } function calcadd(a, b) { console.log(a+b); return a + b; } // aop增强 calcadd = constructor(calcadd, function() { console.log('add before'); }, function() { console.log('add after'); }); // 要求依次执行 add before 5 add after calcadd(2, 3);



// aop 工厂模式

var aopfactory = function(before, after) { // 构造方法,在原方法前后增加执行方法 function constructor(originfun){ function _class(){ proxy.before.apply(this, arguments); originfun.apply(this, arguments); proxy.after.apply(this, arguments); } return _class; } // 代理对象,a为被代理方法,b为目标对象 var proxy = { add: function(a, b) { var fnname = ''; if (typeof a === 'function') { fnname = a.name; } else if (typeof a === 'string') { fnname = a; } else { return; } // 不传对象的话默认为window b = b || window; if (typeof b === 'object' && b[fnname]) { b[fnname] = constructor(b[fnname]); } }, before: function() { }, after: function() { } }; if (typeof before === 'function') { proxy['before'] = before; } if (typeof after === 'function') { proxy['after'] = after; } return proxy; } var printproxy, checkproxy; // 打印参数 function printarguments(){ for(var i = 0; i < arguments.length; i++){ console.info("param" + (i + 1) + " = " + arguments[i]); } } // 打印和 function printsum() { var sum = 0; for(var i = 0; i < arguments.length; i++){ sum += arguments[i]; } console.log('和', sum); } // 传入一个打印参数的aop前增强 printproxy = aopfactory(printarguments, printsum); function calcadd(a, b) { return a + b; } // 传入需要增强的原方法 printproxy.add(calcadd); calcadd(1, 2);