js中的 AOP
原文 :http://blog.csdn.net/notejs/article/details/8770575
面向切面的编程(AOP)还是有点意思的,可以在不修改原有代码的情况下增加新功能。有一些js框架实现AOP功能,但是有些时候我们并不能依赖于框架写程序(框架可能很笨重),我们需要自己实现一些适合我们的功能模块。下面是我自己实现的js AOP,实现了before和after功能,仅供抛砖。
如下是aspect.js,是实现AOP的全过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | ( function (window, undefined){ function aspect(type){ return function (target, methodName, advice){ var exist = target[methodName], dispatcher; if ( !exist || exist.target != target ){ dispatcher = target[methodName] = function (){ // before methods var beforeArr = dispatcher.before; var args = arguments; for ( var l = beforeArr.length ; l--; ){ args = beforeArr[l].advice.apply( this , args) || args; } // target method var rs = dispatcher.method.apply( this , args); // after methods var afterArr = dispatcher.after; for ( var i = 0, ii = afterArr.length; i < ii; i++){ rs = afterArr[i].advice.call( this , rs, args) || rs; } // return object return rs; } dispatcher.before = []; dispatcher.after = []; if ( exist ){ dispatcher.method = exist; } dispatcher.target = target; } var aspectArr = (dispatcher || exist)[type]; var obj = { advice : advice, _index : aspectArr.length, remove : function (){ aspectArr.splice( this ._index, 1); } }; aspectArr.push(obj); return obj; }; } window.aspect = { before : aspect( "before" ), after : aspect( "after" ) }; return window.aspect; })(window); // 以下是测试代码: var as = window.aspect; var obj = { url: "" , get : function (key){ return this [ "key" ]; }, set : function (key, value){ this [ "key" ] = value; } }; var h1 = as.before(obj, "set" , function (key, value){ // 返回一个数组可以修改参数 value += " before-1 " ; //console.log(value); return [key, value]; }); var h2 = as.before(obj, "set" , function (key, value){ // 没有返回值则参数不会变化 value += " before-2 " ; //console.log(value); }); obj.set( "url" , "http://mojijs.com" ); console.log( obj.get( "url" ) ); var h3 = as.after(obj, "get" , function (value){ // 没有返回值不会修改原函数的返回值 value += " after-1 " ; //console.log(value); }); var h4 = as.after(obj, "get" , function (value){ // 有返回值会修改原函数的返回值 value += " after-2 " ; //console.log(value); return value; }); console.log( obj.get( "url" ) ); h1.remove(); // 删除切面方法 h4.remove(); // 删除切面方法 obj.set( "url" , "http://baidu.com" ); console.log( obj.get( "url" ) ); |
==== 2013.04.12 update
本程序已经略做修改并提交github(https://github.com/notejs/aop),现在可同时支持浏览器和node.js环境。
浏览器环境可以通过window.aop使用。
node.js环境安装方法为npm install node-aop。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现