高阶函数实现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的内置对象中同样存在 ...
随机推荐
- HDU2089 暴力打表
62的判断就是倒过来没有26 hdu2089 #include<cstdio> #include<cstdlib> #include<iostream> #incl ...
- jS判断浏览器终端
在做移动端项目的时候,常常会遇到需要判断页面浏览终端的需求.要想判断是什么浏览器终端,先打印 navigator.userAgent 出来.所以收集了几种比较常用的方法: if(/(iPhone|iP ...
- 一步一个坑 - WinDbg调试.NET程序
引言 第一次用WinDbg来排查问题,花了很多时间踩坑,记录一下希望对后面的同学有些帮助. 客户现场软件出现偶发性的界面卡死现象一直找不出原因,就想着让客户用任务管理器生成了一个dump文件发给我,我 ...
- 学习总结---SNAT和DNAT
1.SNAT是结合源ip+源端口号变化的NAT功能. DNAT是将目的ip直接转换成私有的目的ip.(是否转换目的端口号?) 2.SNAT的应用场景:公司内部访问互联网时,使用公共的公网ip.从内到外 ...
- (转)Python-正则表达式
在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...
- win10 删除设备和驱动器中你不要的图标
设备和驱动器可能有很多你不想要的东西,360云盘,百度网盘,微云-- 删除设备和驱动器中的百度云图标,360网盘图标,要去注册表 运行 regedit 点开 HKEY_CURRENT_USER\SOF ...
- 常用的HTTP状态码
成功的状态码: 200 – 服务器成功返回网页 304 – 未修改 失败的状态码: 404 – 请求的网页不存在 503 – 服务器暂时不可用 500 – 服务器内部错误 下面的不是很常用,记住上面那 ...
- 【JDK1.8】JDK1.8集合源码阅读——HashMap
一.前言 笔者之前看过一篇关于jdk1.8的HashMap源码分析,作者对里面的解读很到位,将代码里关键的地方都说了一遍,值得推荐.笔者也会顺着他的顺序来阅读一遍,除了基础的方法外,添加了其他补充内容 ...
- RabbitMQ 笔记-Exchanges
Procuder Publish的Message进入了Exchange.接着通过"routing keys", RabbitMQ会找到应该把这个Message放到哪个queue里. ...
- 手把手教你解决无法创建 JPA 工程的问题
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7703803.html ------------------------------------ ...