原文:http://blog.csdn.net/yangzhihello/article/details/40377399

下面的代码有点问题,

  ins[methodName] = function(){

       callback.apply(ins,arguments)

    return method.apply(ins,arguments);

}

这段也要放到上面的if 语句块里面去!!!

补充, 通过后面一片aop的文章的理解,我发现,这里的aop的实现方式,会改变原有函数的行为,这种貌似不大好。但是,后面一篇的方式在Function.prototpye上面的方式,好像也不大好。

-------------------------------------------------------------------------------------------------------------------

对于java中的aop,早有耳闻,所谓面向切面编程,不过一直都以为只是在后台才会用到。

从做前端开始就没有这方面的需求,这一次对于一些东西做新的想法,发现有些东西还是可以去考虑考虑的。

有一个公用的代码,可能在很多地方都会被用到,那么现在要做的就是,需要这个方法跑起来之前走一些东西,在这个方法跑完之后,还在处理一些东西。

那么问题就来了:

1 直接改之前封装好的东西,Ok,可以没问题,但是这样做了之后,别处用到这个东西的地方就直接崩溃了!

2 那么如果采用直接复制一份代码,修改单个这一处的问题,ok,没有问题,但是这不也就是代表着代码冗余越来越多。

这个时候想起了,在java里面有一个东西,面向切面,添加切点,一切似乎就可以正常的跑起来了。是的,就这么干.....

如下:

由于是工具类,无需实例化,刚直接可以采用{}对象方式:

  1. aop = window.aop || {};
  2. aop = {
  3. doBefore:function(ins,methodName,callback){
  4. if(typeof ins[methodName] != "undefined"){
  5. var method = ins[methodName];
  6. }
  7. ins[methodName] = function(){
  8. callback.apply(ins,arguments)
  9. return method.apply(ins,arguments);
  10. }
  11. },
  12. doAfter:function(ins,methodName,callback){
  13. if(typeof ins[methodName] != "undefined"){
  14. var method = ins[methodName];
  15. }
  16. ins[methodName] = function(){
  17. var ret = method.apply(ins,arguments),
  18. callret = callback.apply(ins,arguments);
  19. return typeof callret == "undefined" ? ret : callret;
  20. }
  21. }
  22. }
 

html 中测试如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  3. <head>
  4. <script type="text/javascript" src="aop.js"></script>
  5. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  6. <title>aop javascript</title>
  7. </head>
  8. <body>
  9. <script type="text/javascript">
  10. //json对象
  11. var obj = {
  12. run:function(){
  13. console.log("run");
  14. },
  15. init:function(name){
  16. console.log("arguments : " + name);
  17. return "info";
  18. }
  19. };
  20. aop.before(obj,"run",function(){
  21. console.log("run before");
  22. });
  23. aop.after(obj,"run",function(){
  24. console.log("run after");
  25. });
  26. console.log("<!-----json对象--------->");
  27. obj.run();
  28. var F = function(){};
  29. F.prototype = {
  30. run:function(){
  31. console.log("prototype run");
  32. }
  33. };
  34. //创建对象
  35. console.log("<!-----创建对象--------->");
  36. var f = new F();
  37. aop.before(f,"run",function(){
  38. console.log("prototype run before");
  39. });
  40. aop.after(f,"run",function(){
  41. console.log("prototype run after");
  42. });
  43. f.run();
  44. //参数问题
  45. console.log("<!-----参数问题--------->");
  46. aop.before(obj,"init",function(name){
  47. console.log("arguments before :" + name);
  48. });
  49. aop.after(obj,"init",function(name){
  50. console.log("arguments after :" + name);
  51. return "next";
  52. });
  53. console.log(obj.init("user"));
  54. </script>
  55. </body>
  56. </html>
 

这里多种情况,包括参数的传递问题,皆有考虑!

偶有所得,以记录之,谨防忘记!

【转】面向切面编程-AOP,挺有用的的更多相关文章

  1. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  2. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  3. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  4. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  5. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  6. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  7. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  8. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  9. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

随机推荐

  1. Chomp游戏(必胜策略分析)

    游戏简介 Chomp是一个双人游戏,有m x n块曲奇饼排成一个矩形格状,称作棋盘. ----两个玩家轮流自选一块还剩下的曲奇饼,而且还要把它右边和下边所有的曲奇饼都取走(如果存在) ----先吃到左 ...

  2. this.$Message.success('提示信息') 少写了一个c 导致报错

    this.$Message.success('提示信息') 少写了一个c 导致报错 而且 $Message 输出还没显示,导致我以为是没有 $Message 对象了,其实全局对象直接调用即可

  3. python基础一 day7 复习文件操作

    read()原样输出 读取出来的是字符串类型 readline()输出一行 读取出来的是字符串类型 readlines()把每行文本作为一个字符串存入列表,并返回列表 打开方式: b以bytes类型打 ...

  4. Eclipse 下载 开源项目 maven依赖丢失和 Deployment Assembly 丢失

    周末下载了最新的jeecg的源码来瞅瞅,但是下载后发现,pom文件中定义的依赖都丢失了. 如下图 上网搜索了一下啊,发现需要先给这个项目这个项目 disable maven nature 然后再添加上 ...

  5. 基于jquery的自定义显示消息数量

    根据需求简单的实现一个小功能控件,暂时不支持扩展 $("xxxxxxx").iconCountPlugin(options, start, isOffset) {//三个参数,自定 ...

  6. mongdb数据库的操作

    一.数据库使用 1.使用mongodb服务,必须先开启服务,开启服务使用 mongod --dbpath D:mongdb    (D:mongdb  自己所创建数据库的路径, 在cmd窗口中输入) ...

  7. Ubuntu14.04环境下Qt5.5以上版本无法输入中文的解决教程

    1.前言 由于Qt5.4之后对之前的Qt5版本不再二进制兼容,所以网上很多简单的旧的办法已经失效了,所以本教程的办法是重新编译fcitx-qt5,生成最新的libfcitxplatforminputc ...

  8. 树莓派 Centos7 安装EPEL 7

    cat > /etc/yum.repos.d/epel.repo << EOF [epel] name=Epel rebuild for armhfp baseurl=https:/ ...

  9. (13) openssl ca(签署和自建CA)

    用于签署证书请求.生成吊销列表CRL以及维护已颁发证书列表和这些证书状态的数据库.因为一般人无需管理crl,所以本文只介绍openssl ca关于证书管理方面的功能. 证书请求文件使用CA的私钥签署之 ...

  10. Go:文件操作

    一.打开文件和关闭文件 os包File结构体的两个方法: func Open(name string) (file *File, err error) Open打开一个文件用于读取.如果操作成功,返回 ...