原文: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. java 随机数 <%=System.currentTimeMillis() %>

    java 随机数<c:set var="version" value="<%=System.currentTimeMillis() %>"/& ...

  2. stay hungry stay foolish.

    I am honored to be with you today at your commencement from one of the finest universities in the wo ...

  3. python 一些函数和类用法记录

    这一篇主要用来记录在学习过程中遇到的一些觉得有意思的函数或者类的用法,有一些用法感觉很炫酷. 1.collections.defaultdict from collections import def ...

  4. Apache web服务

    1.apache 1> 世界上使用率最高的网站服务器,最高时可达70%:官方网站:apache.org 2> http 超文本协议 HTML超文本标记语言 3> URL 统一资源定位 ...

  5. Linux修改网卡名

    问题现象:戴尔机器网卡名为em1,修改为eth0a)由于未发现有/etc/udev/rule.d/70-persistent-net.rules文件,重启后也未发现此文件手动执行/lib/udev/w ...

  6. DB2表空间

    https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0902yuancg/ 临时表空间的使用 (sorts or jo ...

  7. python:端口扫描邮件推送

    #!/usr/bin/env python import pickle import smtplib from email.mime.text import MIMEText import nmap ...

  8. ubuntu14.04 RockMongo的配置

    安装php5 安装php5     sudo apt-get install php5 让Apache支持php      sudo apt-get install libapache2-mod-ph ...

  9. PHP 配置文件php.ini文件优化

    PHP 5.3.3 safe_mode = On #控制php中的函数执行比如system() 这个函数可以调用系统目录 比如 rm ,打开这个配置之后,同时把很多文件操作的函数进行了权限控制 saf ...

  10. POJ 1252 Euro Efficiency(最短路 完全背包)

    题意: 给定6个硬币的币值, 问组成1~100这些数最少要几个硬币, 比如给定1 2 5 10 20 50, 组成40 可以是 20 + 20, 也可以是 50 -10, 最少硬币是2个. 分析: 这 ...