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的更多相关文章

  1. javascript 高阶函数 实现 AOP 面向切面编程 Aspect Oriented Programming

    AOP的主要作用是吧一些跟核心业务逻辑模块无关的功能 -日志统计, 安全控制, 异常处理- 抽离出来, 再通过"动态织入"的方式掺入业务逻辑模块中. 这里通过扩展Function. ...

  2. javascript设计模式学习之三—闭包和高阶函数

    一.闭包 闭包某种程度上就是函数的内部函数,可以引用外部函数的局部变量.当外部函数退出后,如果内部函数依旧能被访问到,那么内部函数所引用的外部函数的局部变量就也没有消失,该局部变量的生存周期就被延续. ...

  3. Javascript 闭包与高阶函数 ( 一 )

    上个月,淡丶无欲 让我写一期关于 闭包 的随笔,其实惭愧,我对闭包也是略知一二 ,不能给出一个很好的解释,担心自己讲不出个所以然来. 所以带着学习的目的来写一写,如有错误,忘不吝赐教 . 为什么要有闭 ...

  4. js 高阶函数 闭包

    摘自  https://www.cnblogs.com/bobodeboke/p/5594647.html 建议结合另外一篇关于闭包的文章一起阅读:http://www.cnblogs.com/bob ...

  5. JavaScript高阶函数的应用

    定义 高阶函数是指至少满足下列条件之一的函数: 函数可以作为参数被传递: 函数可以作为返回值输出. JavaScript语言中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是 ...

  6. 深入理解javascript函数进阶系列第一篇——高阶函数

    前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...

  7. 《JavaScript设计模式与开发》笔记 6.高阶函数

    1.函数作为参数传递 1.回调函数 2.Array.prototype.sort 2.函数作为返回值输出 1.判断数据的类型 3.高级函数的实现AOP 4.高阶函数的其他应用 1.currying 函 ...

  8. JavaScript高阶函数(Heigher-order function)

    概念 <javascript设计模式和开发实践>中定义 函数既可作为参数被传递,也可以作为返回值输出 满足以下条件: 接受一个或多个函数作为输入 输出一个函数 高阶函数一般是那些函数型包含 ...

  9. JS中的高阶函数

    JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...

随机推荐

  1. 简单又炫酷的two.js 二维动画教程

      前  言 S     N 今天呢给大家介绍一个小js框架,Two.JS.其实在自己学习的过程中并没有找到合适的教程,所以我这种学习延迟的同学是有一定难度的,然后准备给大家整理一份,简单易懂的小教程 ...

  2. ERROR! MySQL server PID file could not be found!的解决方法

    启动MySQL服务 [root@test vhosts]# /etc/init.d/mysqld restart 提示错误: ERROR! MySQL server PID file could no ...

  3. js中 && 与 || 的妙用

    在js逻辑运算中,0."".null.false.undefined.NaN都会判为false,其他都为true(好像没有遗漏了吧,请各位确认下).这个一定要记住,不然应用||和& ...

  4. python之串口操作

    1.安装pyserial linux上直接安装: #python2 sudo pip install pyserial #或者python3 sudo pip3 install pyserial Wi ...

  5. WPF---Effect效果

    在 WPF 中,可以使用 BitmapEffect 对象为每一个 Visual 对象生成各种各样的效果,一个 Visual 对象可以设置一种或多种 BitmapEffect 效果,WPF 内置了几种效 ...

  6. jquery系列教程1-选择器全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件 ...

  7. Linux上的文件搜索

    locate 基础了解 在centos7上默认没有locate命令,需要先手动安装.安装步骤:http://www.cnblogs.com/feanmy/p/7676717.html locate命令 ...

  8. visual studio 2015 warning MSB3246

    在我们很高兴的按下 本地计算机运行 按钮,希望看到我们程序运行的时候,垃圾vs就告诉我们,你的程序出现了问题,问题就是: warning MSB3246: 解析的文件包含错误图像.无元数据或不可访问. ...

  9. (转)关于Tomcat的点点滴滴(体系架构、处理http请求的过程、安装和配置、目录结构、设置压缩和对中文文件名的支持、以及Catalina这个名字的由来……等)

    转自:http://itfish.net/article/41668.html   总结Tomcat的体系架构.处理http请求的过程.安装和配置.目录结构.设置压缩和对中文文件名的支持.以及Cata ...

  10. Javascript中NaN、null和undefinded的区别

    var a1; var a2 = true; var a3 = 1; var a4 = "Hello"; var a5 = new Object(); var a6 = null; ...