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 相关文章推荐
Display SQL Server Version Information
Jun 21 Javascript
基于jquery DOM写的类似微博发布的效果
Oct 20 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
Dec 11 Javascript
javascript实现修改微信分享的标题内容等
Dec 11 Javascript
jQuery实现表格颜色交替显示的方法
Mar 09 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
Jan 15 Javascript
简单实现node.js图片上传
Dec 18 Javascript
JS点击缩略图整屏居中放大图片效果
Jul 04 Javascript
Vue.js实现开发购物车功能的方法详解
Feb 22 Javascript
在vue中使用G2图表的示例代码
Mar 19 Javascript
Vue 中 filter 与 computed 的区别与用法解析
Nov 21 Javascript
vscode自定义vue模板的实现
Jan 27 Vue.js
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
PHP新手入门学习方法
2011/05/08 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
CSS常用网站布局实例
2008/04/03 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
JS实现瀑布流布局
2017/10/21 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
Python实现获取某天是某个月中的第几周
2015/02/11 Python
python中正则的使用指南
2016/12/04 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
对python中的argv和argc使用详解
2018/12/15 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
python区块及区块链的开发详解
2019/07/03 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
大学生饮食连锁店创业计划书
2014/01/17 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
单位病假条范文
2015/08/17 职场文书
小学中队长竞选稿
2015/11/20 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis