高阶函数实现AOP
AOP(面向切面程序)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日至统计、安全控制、异常处理等。把这些功能抽离出来之后,再通过“动态织入”的方式掺入业务逻辑模块中。这样做的好处首先是可以保证业务逻辑模块的纯洁和高内聚性,其次是可以很方便的复用日志统计模块。在JavaScript中实现AOP,都是只把一个函数“动态织入”到另一个函数之中,具体实现技术很多,现在用prototype来实现一个
面向切面程序
Function.prototype.before=function(beforefn){
var self=this;//保存原函数的引用
return function(){//返回包含了原函数和新函数的“代理”函数
beforefn.apply(this,arguments);//执行新函数,修正this
return self.apply(this,arguments);//执行原函数
}
}
Function.prototype.after=function(afterfn){
var self=this;//保存原函数的引用
return function(){//返回包含了原函数和新函数的“代理”函数
var ret=self.apply(this,arguments);//执行原函数
afterfn.apply(this,arguments);//执行新函数,修正this
return ret;
}
} var fn=function(){
console.log("fn");
}
fn=fn.before(function(){
console.log("before");
}).after(function(){
console.log("after");
}); fn();
使用场景
AOP(面向切面程序)使用的场景还是很多的,那最简单例子来说,现在小明入职刚刚入职,之前他们写的代码小明还没时间看,现在呢!要小明实现一个form表单提交前验证。小明看了看之前的验证规则,是一个很大的函数,内部代码混乱不堪,无从下手,甚至不知道修改了会不会影响其他功能。现在AOP(面向切面程序)就给我们提供了方便。下面我给大家演示一下怎么使用。
Function.prototype.before=function(beforefn){
var self=this;//保存原函数的引用
return function(){//返回包含了原函数和新函数的“代理”函数
if(beforefn.apply(this,arguments)){
return self.apply(this,arguments);//执行原函数
};//执行新函数,修正this
}
} var fn=function(){
console.log("form表单提交");
}
fn=fn.before(function(){
if(1==1){
console.log("验证通过");
return true;
}else{
console.log("验证失败");
return false;
} }) fn();
可以看出,我们不需要知道你这个函数内容是什么。我们只关心我们写的代码,用户提交的数据是否正确。
简单方式实现AOP(面向切面程序)
function ajax(){
console.log("fajax提交");
}
var ajaxfn=ajax;//把ajax函数引用保存起来。
var ajax=function (){//重新ajax函数;
if(1==1){
console.log("验证通过");
}else{
return false;
}
//先验证上边代码在执行ajax提交
ajaxfn();
}
ajax();
这种方式会修改原函数,重新ajax时候一定要用函数表达式,不能用函数声明。因为函数声明会前置。类似于变量提升一样。
总结:
AOP(面向切面程序)在实际应用中还是很广泛。希望上边的方法能够帮助你写出更为简洁的代码处理复杂的业务。如果有不对的地方希望大家指出。
高阶函数实现AOP的更多相关文章
- javascript 高阶函数 实现 AOP 面向切面编程 Aspect Oriented Programming
AOP的主要作用是吧一些跟核心业务逻辑模块无关的功能 -日志统计, 安全控制, 异常处理- 抽离出来, 再通过"动态织入"的方式掺入业务逻辑模块中. 这里通过扩展Function. ...
- javascript设计模式学习之三—闭包和高阶函数
一.闭包 闭包某种程度上就是函数的内部函数,可以引用外部函数的局部变量.当外部函数退出后,如果内部函数依旧能被访问到,那么内部函数所引用的外部函数的局部变量就也没有消失,该局部变量的生存周期就被延续. ...
- Javascript 闭包与高阶函数 ( 一 )
上个月,淡丶无欲 让我写一期关于 闭包 的随笔,其实惭愧,我对闭包也是略知一二 ,不能给出一个很好的解释,担心自己讲不出个所以然来. 所以带着学习的目的来写一写,如有错误,忘不吝赐教 . 为什么要有闭 ...
- js 高阶函数 闭包
摘自 https://www.cnblogs.com/bobodeboke/p/5594647.html 建议结合另外一篇关于闭包的文章一起阅读:http://www.cnblogs.com/bob ...
- JavaScript高阶函数的应用
定义 高阶函数是指至少满足下列条件之一的函数: 函数可以作为参数被传递: 函数可以作为返回值输出. JavaScript语言中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是 ...
- 深入理解javascript函数进阶系列第一篇——高阶函数
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...
- 《JavaScript设计模式与开发》笔记 6.高阶函数
1.函数作为参数传递 1.回调函数 2.Array.prototype.sort 2.函数作为返回值输出 1.判断数据的类型 3.高级函数的实现AOP 4.高阶函数的其他应用 1.currying 函 ...
- JavaScript高阶函数(Heigher-order function)
概念 <javascript设计模式和开发实践>中定义 函数既可作为参数被传递,也可以作为返回值输出 满足以下条件: 接受一个或多个函数作为输入 输出一个函数 高阶函数一般是那些函数型包含 ...
- JS中的高阶函数
JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...
随机推荐
- windows下PHP中Fatal error Call to undefined function curl_init()的解决方法
参考官方解决方法:http://nz.php.net/manual/en/curl.installation.php 1.php安装目录下的ext文件夹下面是否有php_curl.dll文件,然后右键 ...
- Linux下Apache https认证
参考:http://kyfxbl.iteye.com/blog/1910891 http://showerlee.blog.51cto.com/2047005/1266712 一.环境 httpd:A ...
- FPGA在其他领域的应用(一)
测试和测量应用: 测试需要是所有细分市场的要求.无论是终端市场,所有产品在运到最终客户之前都必须进行测试.这动态地驱动测试和测量领域的普遍性质,其中包括下面的种类和分段: 通信测试: 无线测试仪 (W ...
- [js插件开发教程]一步步开发一个可以定制配置的隔行变色小插件
隔行变色功能,不用js,直接用css伪类就可以做,这个实例可以作为js插件开发很好的入门级实例.本文实现的隔行变色包括以下功能: 1,支持2种常用结构共存( div元素 和 表格类型 ) 2,一个页面 ...
- HTML与标记属性
网站部分:UI:AI.PS 前端:html.css.js 网站:是一个存放在网络服务器上的完整信息的集合体.由域名.空间服务器.网站程序.数据库等组成.由多个网页以一定的方式连接在一起,成为一个整体. ...
- asp.net mvc5中使用缓存依赖SqlCacheDependency
缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...
- Dos命令打印文件以及Dos打印到USB打印端口
MS-DOS命令范例 要将当前目录中的 Report.txt 发送到连上本地计算机的 LPT2,请键入: print /d:LPT2 report.txt 要将 c:\Accounting 目录中的 ...
- mybatis 和hibernate的区别
mybaits 是不完全的orm(对象关系映射(Object Relational Mapping)框架,需要自己书写sql语句 mybatis学习难度必hibernate低适合关系型模型要求不高的软 ...
- Python学习笔记(二)-Python文件类型及编程模式
Python环境搭建:linux,Windows... Linux下:[root@localhost StudyPython]# python #进入交互模式Python 2.7.11 (defaul ...
- .3-Vue源码之数据劫持(1)
写了一半关机了,又得重新写,好气. 上一节讲到initData函数,其中包含格式化.代理.监听. // Line-3011 function initData(vm) { var data = vm. ...