原文 :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。

最新文章

  1. UnityShader快速上手指南(三)
  2. C语言指针总结
  3. Day06_面向对象第一天
  4. Python基础【第十一篇】文件操作(file()、open()方法和fileinput模块)
  5. 泛型? extents super
  6. ZOJ 2866 Overstaffed Company
  7. 分酒问题(DFS解法)
  8. mysql 和 oracle 的一些小知识
  9. Django使用models建表的一些另类功能
  10. Java五种单例区别
  11. 七牛免费SSL证书申请全流程
  12. springboot自带定时任务和集成quartz
  13. js 下载文件的操作方法
  14. PAT 乙级 1041 考试座位号(15) C++版
  15. R语言-连接MySQL数据库方法
  16. CF613D:Kingdom and its Cities(树形DP,虚树)
  17. SQL语句汇总(一)——数据库与表的操作以及创建约束
  18. C# 单例模式的多种简单实现
  19. (转载)Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
  20. win10 redis安装教程

热门文章

  1. AngularJS展示数据的ng-bind指令和{{}} 区别
  2. pulseaudio的交叉编译
  3. nginx+php-fpm 的配置下,php的错误日志
  4. Socks
  5. linux系统定时重启tomcat
  6. ListView的淡入淡出和Activity的淡入淡出补间动画效果Animation
  7. 一个完整的项目中,需要的基本gulp
  8. lucene-SpanQuery跨度查询基础
  9. QT修改默认的滚动条样式
  10. 【PDF单页转化为图片输出 注意:英文或图片类的PDF可转化,中文抛异常】