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 相关文章推荐
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
Javascript与flash交互通信基础教程
Aug 07 Javascript
angularJS提交表单(form)
Feb 09 Javascript
jQuery判断浏览器并动态调整select宽度的方法
Mar 02 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
浅谈jquery页面初始化的4种方式
Nov 27 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
Nov 09 jQuery
vue 解决遍历对象显示的顺序不对问题
Nov 07 Javascript
React实现评论的添加和删除
Oct 20 Javascript
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 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版(5)
2006/10/09 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
PHP安全配置详细说明
2011/09/26 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
JSONP之我见
2015/03/24 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
python操作MongoDB基础知识
2013/11/01 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
Python对象属性自动更新操作示例
2018/06/15 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
Python logging设置和logger解析
2019/08/28 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
pandas数据拼接的实现示例
2020/04/16 Python
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
自我鉴定200字
2013/10/28 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
离婚协议书范本2014
2014/10/27 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
团队拓展训练感想
2015/08/07 职场文书