JavaScript之AOP编程实例


Posted in Javascript onJuly 17, 2015

本文实例讲述了JavaScript之AOP编程。分享给大家供大家参考。具体如下:

/*
// aop({options});
// By: adamchow2326@yahoo.com.au
// Version: 1.0
// Simple aspect oriented programming module
// support Aspect before, after and around
// usage:
    aop({
      context: myObject,   // scope context of the target function.
      target: "test",     // target function name
      before: function() {  // before function will be run before the target function
        console.log("aop before");
      },
      after: function() {   // after function will be run after the target function
        console.log("aop after");
      },
      around: function() {  // around function will be run before and after the target function
        console.log("aop around");
      }
    });
*/
var aop = (function() {
  var options = {},
    context = window,
    oFn,
    oFnArg,
    targetFn,
    targetFnSelector,
    beforeFn,
    afterFn,
    aroundFn,
    cloneFn = function(Fn) {
      if (typeof Fn === "function") {
        return eval('[' +Fn.toString()+ ']')[0];
      }
      return null;
    },
    checkContext = function() {
      if (options.context) {
        context = options.context;
      }
      if (typeof context[(options.target).name] === "function") {
        targetFnSelector = (options.target).name;
        targetFn = context[targetFnSelector];
      }
      else if (typeof context[options.target] === "function") {
        targetFnSelector = options.target;
        targetFn = context[targetFnSelector];
      }
      if (targetFn) {
        oFn = cloneFn(targetFn);
        oFnArg = new Array(targetFn.length);
        return true;
      }
      else {
        return false;
      }
    },
    run = function() {
      context[targetFnSelector] = function(oFnArg) {
        if (aroundFn){
          aroundFn.apply(this, arguments);
        }
        if (beforeFn){
          beforeFn.apply(this, arguments); // 'this' is context
        }
        oFn.apply(this, arguments);
        if (afterFn){
          afterFn.apply(this, arguments); // 'this' is context
        }
        if (aroundFn){
          aroundFn.apply(this, arguments);
        }
      };
    };
  return function(opt){
    if (opt && typeof opt === "object" && !opt.length) {
      options = opt;
      if (options.target && checkContext()) {
        if (options.before && typeof options.before === "function") {
          beforeFn = options.before;
        }
        if (options.after && typeof options.after === "function") {
          afterFn = options.after;
        }
        if (options.around && typeof options.after === "function") {
          aroundFn = options.around;
        }
        run();
      }
    }
  };
})();
// test examples
// ----------------- aop modify global function ---------------//
function test(name, age) {
  console.log("test fn. name = " + name + " age: " + age);
}
aop({
  target: "test",
  before: function() {
    console.log("aop before");
  },
  after: function() {
    console.log("aop after");
  },
  around: function() {
    console.log("aop around");
  }
});
// run
test("adam", 6);
// ----------------- aop test modify method in an object ---------------//
var myobj = {
  myName: "testName",
  sayName: function() {
    console.log(this.myName);
  },
  childObj: {
    age: 6,
    say: function() {
      console.log(this.age);
    }
  }
};
aop({
  context: myobj,
  target: "sayName",
  before: function() {
    console.log("aop before say name = " + this.myName);
  },
  after: function() {
    console.log("aop after say name = " + this.myName);
  },
  around: function() {
    console.log("aop around say name = " + this.myName);
  }
});
// run
myobj.sayName();
aop({
  context: myobj.childObj,
  target: "say",
  before: function() {
    console.log("aop before say name = " + this.age);
  },
  after: function() {
    console.log("aop after say name = " + this.age);
  },
  around: function() {
    console.log("aop around say name = " + this.age);
  }
});
myobj.childObj.say();

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
早该知道的7个JavaScript技巧
Mar 27 Javascript
js模拟hashtable的简单实例
Mar 06 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
Dec 23 Javascript
JavaScript实现的select点菜功能示例
Jan 16 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
Sep 18 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
vue实现搜索过滤效果
May 28 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
Jun 17 Javascript
js+html5实现可在手机上玩的拼图游戏
Jul 17 #Javascript
javascript封装的sqlite操作类实例
Jul 17 #Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
Jul 17 #Javascript
javascript实现根据3原色制作颜色选择器的方法
Jul 17 #Javascript
javascript实现树形菜单的方法
Jul 17 #Javascript
JSON与XML优缺点对比分析
Jul 17 #Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 #Javascript
You might like
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
php fread读取文件注意事项
2016/09/24 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
Python File readlines() 使用方法
2018/03/19 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
安全目标管理责任书
2014/07/25 职场文书
平安工地汇报材料
2014/08/19 职场文书
乡镇党建工作汇报材料
2014/10/27 职场文书
检讨书范文2000字
2015/01/28 职场文书
党员年度个人总结
2015/02/14 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
千万级用户系统SQL调优实战分享
2022/03/03 MySQL