原文: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>
 

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

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

最新文章

  1. Python3 登陆网页并保持cookie
  2. [编译] 1、第一个makefile简单例子
  3. 忘记oracle的sys用户密码怎么修改
  4. mysql转换引擎的方法
  5. NPN&amp;PNP
  6. Android中的SQLite使用学习
  7. TravelCMS旅游网站系统前台诞生记-2(后台框架篇)
  8. UINavigationController 导航控制器
  9. Delphi线程同步(临界区、互斥、信号量,包括详细代码)
  10. Eclipse RCP扩展
  11. Cmake出现CMake Error: Could not find CMAKE_ROOT !!!
  12. angular2的lazyload初体验
  13. Idea的快捷键,瞎摸索,开心就好,哈哈哈
  14. 『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较_&amp;_广播原理简介
  15. webservice------UDDI SOAP WSDL 之间的关系
  16. Android忘记锁屏密码如何进入手机?
  17. Android -- ConditionVariable
  18. django 文档生成器
  19. 贝塞尔曲线.简单推导与用opengl实现动态画出。
  20. jQuery学习-页面就绪函数

热门文章

  1. linux下的基础操作
  2. Python list 增加/插入元素的说明
  3. QT+常见控件+tab Widget 和Stacked Widget
  4. selenium 浏览器基础操作(Python)
  5. C#对象初始化的探讨
  6. 2. CHARACTER_SETS
  7. 条款10:令operator=返回一个reference to * this(Have assignment operators return a reference to *this)
  8. 剑指Offer(书):二叉树的下一个节点
  9. str内部方法释义
  10. [图文教程] 使用Git 提交项目到码云