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可以对业务逻辑各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低 ...
随机推荐
- Python 日志处理(一) 按Nginx log_format 分割日志记录
要求:不使用正则 根据nginx 默认的日志记录格式,分割日志记录. log_format main '$remote_addr - $remote_user [$time_local] " ...
- 如何有效的去使用一款免费的ERP
现在市场上免费的软件不少,怎么样去使用一款免费产品是很多人比较头疼的事情. 一般使用免费ERP软件的基本都是小企业,没用过想用又舍不得花钱.如果企业有懂数据库这块儿的管理员,那都还好.如果没有,那建议 ...
- RecyclerView.ItemDecoration
decoration 英文意思: 英[ˌdekəˈreɪʃn] 美[ˌdɛkəˈreʃən] n. 装饰品; 装饰,装潢; 装饰图案,装饰风格; 奖章; [例句]The decoration and ...
- 【Centos】解决设置JAVA_HOME不断失效问题
问题还原: 我们都知道,要修改centos的全局配置,可以在/etc/profile这个文件里面修改,比如,我需要修改JAVA_HOME变量 ,那么一般来说我们只要在其中修改,source 一下就行了 ...
- C# 通过url地址获取页面内容
using System.Net; using System.IO; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(" ...
- smali语法(二)
一.smali的包中信息 .class public Lcom/aaaaa; .super Lcom/bbbbb; .source "ccccc.java" 1.它是com.aaa ...
- Tomcat中虚拟路径
默认情况下,Tomcat访问静态资源配置是这样的 <Context path="/project_name" docBase="d:\tomcat_statics& ...
- CenterOS 7 基础命令学习
CentOS 7 命令 网络配置 nmcli(NetworkManageCommandLineInterface)查看网卡 nmtui(NetworkManageTextUserInterface)网 ...
- jquery写的树状列表插件-alvintree
在做项目的时候遇到选择部门下人员的功能,可多选可单选,所以就想着使用树状列表来进行选择,但在网上找了很多,发现要么就是挺复杂,要么就是需要各种前端框架的支持,试了一个感觉难用,所以就想着自己写一个简便 ...
- 使用PowerApps快速构建基于主题的轻业务应用 —— 入门篇
作者:陈希章 发表于 2017年12月12日 前言 在上一篇文章 基于Office 365的随需应变业务应用平台 中我提到,随着随需应变的业务需要,以及技术的发展,业务应用的开发的模式也有了深刻的变化 ...