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 相关文章推荐
才发现的超链接js导致网页中GIF动画停止的解决方法
Nov 02 Javascript
jQuery移除元素自动解绑事件实现思路及代码
May 31 Javascript
javascript的document.referrer浏览器支持、失效情况总结
Jul 18 Javascript
解释&&和||在javascript中的另类用法
Jul 28 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
Sep 08 Javascript
原生JavaScript实现瀑布流布局
Jun 28 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
JS常用算法实现代码
Nov 14 Javascript
React Native悬浮按钮组件的示例代码
Apr 05 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
Feb 27 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
Nov 01 Javascript
Element-ui upload上传文件限制的解决方法
Jan 22 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调用Twitter的RSS的实现代码
2010/03/10 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
详解JavaScript原型与原型链
2020/11/16 Javascript
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
python机器学习之神经网络(一)
2017/12/20 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
python文件编写好后如何实践
2020/07/07 Python
用python实现学生管理系统
2020/07/24 Python
绩效专员岗位职责
2013/12/02 职场文书
大学毕业生个人自荐信范文
2014/01/08 职场文书
企业安全生产承诺书
2014/05/22 职场文书
霸气队列口号
2014/06/18 职场文书
学习型党组织心得体会
2014/09/12 职场文书
如何做好工作总结!
2019/04/10 职场文书
Jupyter notebook 更改文件打开的默认路径操作
2021/05/21 Python
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电