JavaScript AOP编程实例


Posted in Javascript onJune 16, 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 相关文章推荐
JavaScript使用技巧精萃[代码非常实用]
Nov 21 Javascript
jquery实现input输入框实时输入触发事件代码
Jan 28 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
May 05 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
May 26 Javascript
javascript实现随机读取数组的方法
Aug 03 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
JS封装的选项卡TAB切换效果示例
Sep 20 Javascript
防止重复发送 Ajax 请求
Feb 15 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
Feb 22 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 Javascript
小程序实现点击tab切换左右滑动
Nov 16 Javascript
JS如何监听div的resize事件详解
Dec 03 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 #Javascript
动态加载jQuery的方法
Jun 16 #Javascript
详解AngularJS中的表格使用
Jun 16 #Javascript
js+HTML5实现视频截图的方法
Jun 16 #Javascript
AngularJS中的过滤器使用详解
Jun 16 #Javascript
简述AngularJS的控制器的使用
Jun 16 #Javascript
详解AngularJS中的表达式使用
Jun 16 #Javascript
You might like
php在线代理转向代码
2012/05/05 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
ucenter通信原理分析
2015/01/09 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
功能强大的php分页函数
2016/07/20 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
Javascript缓存API
2016/06/14 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
详解Python编程中包的概念与管理
2015/10/16 Python
Form表单及django的form表单的补充
2019/07/25 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
精灵市场:Pixie Market
2019/06/18 全球购物
iKRIX意大利网上商店:男女豪华服装和配件
2019/10/09 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
英语专业求职信
2014/07/08 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
信息简报范文
2015/07/21 职场文书
新闻通讯稿范文
2015/07/22 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers