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可以对业务逻辑各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低 ...
随机推荐
- Centos 6.9 安装 Redis 3.2.9
依赖包和常用包yum install gcc gcc-c++ make zlib-devel readline readline-devel tkutil tk tkutil-devel tk-dev ...
- centos搭建java web服务器
1.安装jdk7 //检查jdk是否已经安装 [root@iZwz9catu2mrq92b07d1d0Z ~]# yum list installed | grep java java--openjd ...
- 条件随机场 Conditional Random Fields
简介 假设你有冠西哥一天生活中的照片(这些照片是按时间排好序的),然后你很无聊的想给每张照片打标签(Tag),比如这张是冠西哥在吃饭,那张是冠西哥在睡觉,那么你该怎么做呢? 一种方法是不管这些照片的序 ...
- C++反汇编第一讲,认识构造函数,析构函数,以及成员函数
C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...
- 本地git部署web连接azure的git存储库
本地git部署web 创建本地存储仓库 输入以下命令创建git本地仓库(会在当前目录下生产一个.git的目录) git init 然后提交内容 在git仓库所在的目录下存放好需要的网页文件 将文 ...
- php提供的对称加密算法
KEY 是之前定义的常量 Mcrypt::encrypt(); Mcrypt::decrypt(); defined('ROOT') or exit('Access Denied'); class M ...
- PHP+Mysql基于事务处理实现转账功能的方法
<?php header("Content-Type:text/html;charset=utf-8"); $mysqli=new mysqli("localhos ...
- Spark之导出PMML文件(Python)
PMML,全称预言模型标记语言(Predictive Model Markup Language),利用XML描述和存储数据挖掘模型,是一个已经被W3C所接受的标准.PMML是一种基于XML的语言,用 ...
- 大数据学习(1)Hadoop安装
集群架构 Hadoop的安装其实就是HDFS和YARN集群的配置,从下面的架构图可以看出,HDFS的每一个DataNode都需要配置NameNode的位置.同理YARN中的每一个NodeManager ...
- 双向bfs-八数码问题
[八数码][1] [1]: https://www.luogu.org/problem/show?pid=1379 其实除了搜索恶心一点,好像也没什么提高+的 bfs搜的是状态. 双向bfs同时从起点 ...