js实现面向切面的编程(AOP)

js实现面向切面的编程(AOP)

面向切面的编程(AOP) 还是有点意思的,可以在不修改原有代码的情况下增加新功能。有一些js框架实现AOP功能,但是有些时候我们并不能依赖于框架写程序(框架可能很笨重), 我们需要自己实现一些适合我们的功能模块。下面是我自己实现的js AOP,实现了before和after功能,仅供抛砖。

如下是aspect.js,是实现AOP的全过程。

(function(window, undefined){
 function aspect(type){
  return function(target, methodName, advice){
   var exist = target[methodName],
    dispatcher;

if( !exist || exist.target != target ){
    dispatcher = target[methodName] =  function(){
     // before methods
     var beforeArr = dispatcher.before;
     var args = arguments;
     for(var l = beforeArr.length ; l--; ){
      args = beforeArr[l].advice.apply(this, args) || args;
     }
     // target method
     var rs = dispatcher.method.apply(this, args);
     // after methods
     var afterArr = dispatcher.after;
     for(var i = 0, ii = afterArr.length; i < ii; i++){
      rs = afterArr[i].advice.call(this, rs, args) || rs;
     }
     // return object
     return rs;
    }

dispatcher.before = [];
    dispatcher.after = [];

if( exist ){
     dispatcher.method = exist;
    }
    dispatcher.target = target;
   }

var aspectArr = (dispatcher || exist)[type];
   var obj = {
    advice : advice,
    _index : aspectArr.length,
    remove : function(){
     aspectArr.splice(this._index, 1);
    }
   };
   aspectArr.push(obj);

return obj;
  };
 }

window.aspect = {
  before : aspect("before"),
  after : aspect("after")
 };

return window.aspect;

})(window, undefined);
以下是测试代码:

var as = window.aspect;

var obj = {
  url:"",
  get : function(key){
   return this["key"];
  },
  set : function(key, value){
   this["key"] = value;
  }
 };

var h1 = as.before(obj, "set", function(key, value){
  // 返回一个数组可以修改参数
  value += " before-1 ";
  //console.log(value);
  return [key, value];
 });

var h2 = as.before(obj, "set", function(key, value){
  // 没有返回值则参数不会变化
  value += " before-2 ";
  //console.log(value);
 });

obj.set("url", "http://mojijs.com");
 console.log( obj.get("url") );

var h3 = as.after(obj, "get", function(value){
  // 没有返回值不会修改原函数的返回值
  value += " after-1 ";
  //console.log(value);
 });

var h4 = as.after(obj, "get", function(value){
  // 有返回值会修改原函数的返回值
  value += " after-2 ";
  //console.log(value);
  return value;
 });

console.log( obj.get("url") );

h1.remove(); // 删除切面方法
 h4.remove(); // 删除切面方法

obj.set("url", "http://baidu.com");
 console.log( obj.get("url") );

时间: 2024-11-10 14:15:29

js实现面向切面的编程(AOP)的相关文章

Guice 学习(八)AOP (面向切面的编程)

Guice的AOP还是很弱的,目前仅仅支持方法级别上的,另外灵活性也不是很高.看如下示例: Guice支持AOP的条件是: 类必须是public或者package (default) 类不能是final类型的 方法必须是public,package或者protected 方法不能使final类型的 实例必须通过Guice的@Inject注入或者有一个无参数的构造函数 且看示例代码 1.定义接口 package com.guice.AOP; import com.google.inject.Imp

什么叫AOP(面向切面编程)?

spring的AOP面向切面编程,实现在不改变代码的情况下完成对方法的增强.比较常用的就是spring的声明式事务管理,底层通过AOP实现,避免了我们每次都要手动开启事物,提交事务的重复性代码,使得开发逻辑更加清晰. 简单点解释,比方说你想在你的service层所有类中都加上一个打印'你好'的功能这你经可以用aop思想来做,你先写个类写个方法,方法经实现打印'你好'然后你Ioc这个类 ref="service.*"让每个类都注入. aop就是面向切面的编程.比如说你每做一次对数据库操作

面向切面编程——Aop

一.概念 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的方法论,它是对传统OOP编程的一种补充. 二.Aop原理 1.面向对象编程模型 OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分.面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等

Java面试--Spring技术要点--Spring AOP(面向切面编程)

33  Spring AOP的概念 面向切面的编程,是一种编程技术,是OOP(面向对象编程)的补充和完善.OOP的执行是一种从上往下的流程,并没有从左到右的关系.因此在OOP编程中,会有大量的重复代码.而AOP则是将这些与业务无关的重复代码抽取出来,然后再嵌入到业务代码当中.常见的应用有:权限管理.日志.事务管理等. 实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行:二是采用静态织入的方式,引入特定的语法创建"方面"

什么是AOP面向切面编程

什么是AOP 连接地址:http://blog.csdn.net/moreevan/article/details/11977115/ AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合.当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力.也就是说,OOP允许你定义从上到下的关

编程思想—面向切面编程(AOP)

谈到面向切面的编程,我们很容易关联到面向对象编程(OOP).个人对这两种编程方式的解释为:两种编程思想只是站在编程的角度问题. OOP注重的是对象,怎么对对象行为和方法的抽象.如何封装一个具有完整属性以及行为的对象.简单来讲,其实OOP是对一个名词的封装. AOP注重的是行为,怎么对业务逻辑的行为进行划分.如何在逻辑复杂的系统中逻辑划分(领域划分,模块划分,读取划分等).简单来讲,其实AOP是对一系列逻辑操作的分类. 代码示例: 定义用户User: public class User { pub

AOP面向切面编程简介

AOP这个词相信大家都没有接触太多过,但是实际上你们已经有所接触了,就在设计模式中.AOP所用的思想其实和设计模式是一样的,即在不修改原代码的情况下统一增加或者修改功能.还有,AOP大多用在spring里面,但是本文所写的只是在MVC中的应用,要注意. 一.简介 所谓AOP(Aspect Oriented Programming的缩写)意为 面向切面的编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重

Spring总结六:AOP(面向切面编程)

概述: AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的方法论,它是对传统OOP编程的一种补充.AOP是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可. AOP就是将公用功能提取出来,如果以后公用功能的需求发生变化,只需要改动公用的模块的代码即可,多个调用的地方则不需要改

面试题思考:解释一下什么叫AOP(面向切面编程)

这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. AOP是Spring提供的关键特性之一.AOP即面向切面编程,是OOP编程的有效补充. 使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统. 从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑--比如权限管理,事物管理,日志记录等等. 这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可.从而达到了 将不同的关注点分离出来的效果. 本文深入剖析