原文 :http://blog.csdn.net/notejs/article/details/8770575

面向切面的编程(AOP)还是有点意思的,可以在不修改原有代码的情况下增加新功能。有一些js框架实现AOP功能,但是有些时候我们并不能依赖于框架写程序(框架可能很笨重),我们需要自己实现一些适合我们的功能模块。下面是我自己实现的js AOP,实现了before和after功能,仅供抛砖。

如下是aspect.js,是实现AOP的全过程

(function(window, undefined){
function aspect(type){
return function(target, methodName, advice){
var exist = target[methodName],
dispatcher; if( !exist || exist.target != target ){
dispatcher = target[methodName] = function(){
// before methods
var beforeArr = dispatcher.before;
var args = arguments;
for(var l = beforeArr.length ; l--; ){
args = beforeArr[l].advice.apply(this, args) || args;
}
// target method
var rs = dispatcher.method.apply(this, args);
// after methods
var afterArr = dispatcher.after;
for(var i = 0, ii = afterArr.length; i < ii; i++){
rs = afterArr[i].advice.call(this, rs, args) || rs;
}
// return object
return rs;
} dispatcher.before = [];
dispatcher.after = []; if( exist ){
dispatcher.method = exist;
}
dispatcher.target = target;
} var aspectArr = (dispatcher || exist)[type];
var obj = {
advice : advice,
_index : aspectArr.length,
remove : function(){
aspectArr.splice(this._index, 1);
}
};
aspectArr.push(obj); return obj;
};
} window.aspect = {
before : aspect("before"),
after : aspect("after")
}; return window.aspect; })(window);
// 以下是测试代码:
var as = window.aspect; var obj = {
url:"",
get : function(key){
return this["key"];
},
set : function(key, value){
this["key"] = value;
}
}; var h1 = as.before(obj, "set", function(key, value){
// 返回一个数组可以修改参数
value += " before-1 ";
//console.log(value);
return [key, value];
}); var h2 = as.before(obj, "set", function(key, value){
// 没有返回值则参数不会变化
value += " before-2 ";
//console.log(value);
}); obj.set("url", "http://mojijs.com");
console.log( obj.get("url") ); var h3 = as.after(obj, "get", function(value){
// 没有返回值不会修改原函数的返回值
value += " after-1 ";
//console.log(value);
}); var h4 = as.after(obj, "get", function(value){
// 有返回值会修改原函数的返回值
value += " after-2 ";
//console.log(value);
return value;
}); console.log( obj.get("url") ); h1.remove(); // 删除切面方法
h4.remove(); // 删除切面方法 obj.set("url", "http://baidu.com");
console.log( obj.get("url") );

  

==== 2013.04.12 update

本程序已经略做修改并提交github(https://github.com/notejs/aop),现在可同时支持浏览器和node.js环境。

浏览器环境可以通过window.aop使用。

node.js环境安装方法为npm install node-aop。

js中的 AOP的更多相关文章

  1. js 中实现aop

    http://fredrik.appelberg.me/2010/05/07/aop-js/ Aop = { // Apply around advice to all matching functi ...

  2. js 中的方法注入(aop)

    js 中的方法注入 java中很多框架支持 apo 的注入, js中也可以类似的进行实现 主要是通过扩展js中方法的老祖 Function 对象来进行实现. Function.prototype.af ...

  3. .Net中的AOP系列之《方法执行前后——边界切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...

  4. JS中的高阶函数

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

  5. .Net中的AOP系列之构建一个汽车租赁应用

    返回<.Net中的AOP>系列学习总目录 本篇目录 开始一个新项目 没有AOP的生活 变更的代价 使用AOP重构 本系列的源码本人已托管于Coding上:点击查看. 本系列的实验环境:VS ...

  6. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  7. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  8. JS中给正则表达式加变量

    前不久同事询问我js里面怎么给正则中添加变量的问题,遂写篇博客记录下.   一.字面量 其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如: var s = &quo ...

  9. .Net中的AOP读书笔记系列之AOP介绍

    返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...

随机推荐

  1. mybatis 做 insert操作的时候返回插入的那条数据的id

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:吃丸子的小鹿链接:http://www.zhihu.com/question/20810321/answer/16843223 ...

  2. TypeConverter的使用

    我们知道,C#中有int.Parse,int.TryParse这样神奇的功能,那它们又是如何做到的呢?我们试着自己也来自定义一个“转换器”. 首先,定义一个类: public class Human ...

  3. (转载)解析ISO8583报文实例

    本篇文章参考了中国银联POS终端规范,所以如有不明白的可以去我的资源里面下载. 现在我们有ISO8583报文如下(十六进制表示法): 60 00 03 00 00(前五个字节为TPDU) 60 31 ...

  4. 很好的容斥思想 HDU 5514

    题目描述:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条a[i]个石头,问最后所有青蛙跳过的石头的下标总和是多少? 思路:经过绘图我们发现,每次跳过的位置一定是k*gcd(a[i], m).然 ...

  5. jQuery执行流程:

    实例1: 源码: <!DOCTYPE html> <html> <head> <script src="//ajax.googleapis.com/ ...

  6. PHP的curl实现get,post 和 cookie

    类似于dreamhost这类主机服务商,是显示fopen的使用 的.使用php的curl可以实现支持FTP.FTPS.HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE ...

  7. JPA 系列教程2-单表操作

    JPA Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibe ...

  8. web工程中地址的写法

    硬盘地址用\   如:c:\\ 虚拟地址用 / /* 只要是写地址,建议大家最好以"/"开头,/到底代表什么呢? 1.看这个地址是给服务器用的,还是给浏览器用的. 2.如果给浏览器 ...

  9. 444A/CF

    题目链接[http://codeforces.com/problemset/problem/444/A] 题意:给出一个无向图,找出一个联通子图,定义密度#=v(顶点值的和)/e(边值的和). 条件: ...

  10. Hibernate Session & Transaction详解

    Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持 ...