JavaScript:AOP实现
AOP的概念,使用过Spring的人应该都不陌生了。Dojo中,也是支持AOP的。对于JavaScript的其他框架、库不知道有没有AOP的支持。相信即便没有支持,也不会太远了。下面就介绍一下使用JavaScript实现AOP。
AOP的思想就是在目标方法前后加入代码:
|
var result=null; try{ before(); result = targetMethod(params); }(catch e){ error(); }finlly{ after(); } return result; |
在JavaScript中要达到AOP的效果可以利用apply(ctx,arguments)来达到目的,请看下面demo:
这是一个原始的代码:
|
function Person(options){ options = options ? options : {}; this.id = options.id; this.age = options.age>0 ? options.age:0; } Person.prototype.show=function(){ console.log("id: "+this.id + " age: "+ this.age); }; var p = new Person({ id:'test1', age:1 }); p.show(); |
现在想要对show方法植入代码,利用apply这样写就OK了:
|
var targetFunc = Person.prototype.show; var proxyFunc = function(){ var ctx = this; console.log("before ..."); targetFunc.apply(ctx, arguments); console.log("after ..."); } Person.prototype.show = proxyFunc; p = new Person({ id:"test2", age:2 }); p.show(); |
如果要对各种方法植入,这样写肯定是不方便了,所以呢,将这个代码织入的过程提成一个通用的工具:
|
function Interceptor(){ } Interceptor.prototype.before = function(callContext, params){ console.log("before... ", callContext, params); } Interceptor.prototype.after = function(callContext, params){ console.log("after... ", callContext, params); } Interceptor.prototype.error = function(callContext, params){ console.log("error... ", callContext, params); } var InjectUtil = (function(){ function inject(obj, methodName, interceptor){ var targetFun = obj[methodName]; if(typeof targetFun == "function"){ var proxyFun = genProxyFun(targetFun, interceptor); obj[methodName] = proxyFun; } } function genProxyFun(targetFun, interceptor){ var proxyFunc = function(){ var ctx = this; var result = null; interceptor.before(ctx, arguments); try{ result= targetFunc.apply(ctx, arguments); }catch(e){ interceptor.error(ctx, arguments); }finally{ interceptor.after(ctx, arguments); } return result; }; return proxyFunc; }; return { inject:inject } })(); |
测试:
|
Person.prototype.show=function(){ console.log("id: "+this.id + " age: "+ this.age); }; InjectUtil.inject(Person.prototype,"show",new Interceptor()); var p = new Person({ id:"test3", age:3 }); p.show(); |
JavaScript:AOP实现的更多相关文章
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
- javascript AOP实现
参考:http://www.cnblogs.com/rubylouvre/archive/2009/08/08/1541578.html function Person(){ this.say = f ...
- javascript AOP(面向切面编程)
var func = function () { console.log("2") } Function.prototype.before = function (beforefn ...
- javascript AOP
Function.prototype.bind = function(b) { var a = this; return function() { a.apply(b, arguments) } }; ...
- JavaScript面向切面编程入门
来源极客网学习视频 关键词Javascript AOP编程 例子1: function test() { alert(2); } //理解,所谓的传入一个"回调",该怎样设计bef ...
- Dojo动画原理解析
dojo中动画部分分为两部分:dojo/_base/fx, dojo/fx.dojo/_base/fx部分是dojo动画的基石,里面有两个底层API:animateProperty.anim和两个常用 ...
- dojo/aspect源码解析
dojo/aspect模块是dojo框架中对于AOP的实现.关于AOP的详细解释请读者另行查看其它资料,这里简单复习一下AOP中的基本概念: 切面(Aspect):其实就是共有功能的实现.如日志切面. ...
- Javascript如何实现AOP
简介: AOP(面向切面的编程)是为了解决功能的独立性与可维护性而提供的一种编程思想.当多个函数大量重复使用同一个功能时通过分层切分,将功能平衡的划分,从而提高低耦合性. JS中实现: index.h ...
- 聊Javascript中的AOP编程
Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...
- AOP 在javascript 中的使用
AOP(Aspect Oriented Programming) 意为面向切面编程 可以在不修改原有代码的情况下增加新功能,利用AOP可以对业务逻辑各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低 ...
随机推荐
- 机器学习 F1-Score 精确率 - P 准确率 -Acc 召回率 - R
准确率 召回率 精确率 : 准确率->accuracy, 精确率->precision. 召回率-> recall. 三者很像,但是并不同,简单来说三者的目的对象并不相同. 大多时候 ...
- PHP+Redis 实例【一】点赞 + 热度 下篇
这篇主要讲如何将数据保存回Mysql,但是里面还会涉及到如何将错误信息以及提示信息保存到文件里,方便以后的运维,再有就是如何使用PHP写进程BAT. Redis数据刷回数据库前的知识准备 首先针对上篇 ...
- 微信小程序与Java后台的通信
一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的, ...
- 2386:Lake Counting-poj
总时间限制: 1000ms 内存限制: 65536kB 描述 Due to recent rains, water has pooled in various places in Farmer J ...
- MyBatis物理分页的代码实现
一.分页 MyBatis有两种分页方法:内存分页,也就是假分页,本质是查出所有的数据然后根据游标的方式,截取需要的记录,如果数据量大,执行效率低,可能造成内存溢出.物理分页,就是数据库本身提供了分页方 ...
- 实现基于Haproxy+Keepalived负载均衡高可用架构
1.项目介绍: 上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务 ...
- SQL语言(二) java怎样连接操作数据库中的数据
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...
- ShoneSharp语言(S#)的设计和使用介绍系列(1)— 开篇
ShoneSharp语言(S#)的设计和使用介绍 系列(1)- 开篇 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. 一 ...
- Numpy入门 - 数组聚合运算
本节主要讲解numpy的几个常用的聚合运算,包括求和sum.求平均mean和求方差var. 一.求和sum import numpy as np arr = np.array([[1, 2, 3], ...
- accept 文件描述符用尽处理
if (events[i].data.fd == listenfd) { peerlen = sizeof(peeraddr); connfd = ::accept4(listenfd, (struc ...