JS实现AOP

JS实现AOP

<script>
function actsAsAspect(obj,handlers) {
       
if(typeof obj == ‘function‘){
           
obj = obj.prototype;
       
}
      
 
       
for(var methodName in handlers){
           
var _handlers = handlers[methodName];
           
for(var handler in _handlers){
               
if((handler == ‘before‘ || handler == ‘after‘)
&& typeof _handlers[handler] ==
‘function‘){
                   
eval_r(handler)(obj,methodName,_handlers[handler]);
               
}
           
}
       
}

function before(obj,method,f) {
           
var original = obj[method]; 
 
           
obj[method] = function() {
               
f.apply(this, arguments); 
 
               
return original.apply(this, arguments); 
 
           
}
       
}

function after(obj,method, f) { 
 
           
var original = obj[method]; 
 
           
obj[method] = function() {
               
original.apply(this, arguments); 
 
               
return f.apply(this, arguments); 
 
           
}
       
}
    }
    
   
//actsAsAspect(Test,{‘say2‘:{before:function(){alert(‘before‘);},after:function(){alert(‘after‘);}}}); 
 
    
    function
Test(){}

//actsAsAspect(Test,{‘say2‘:{before:function(){alert(‘before‘);},after:function(){alert(‘after‘);}}});

Test.prototype.say2 = function(s){
       
alert(s);
    }
    
   
actsAsAspect(Test,{‘say2‘:{before:function(){alert(‘before‘);},after:function(){alert(‘after‘);}}});

var t = new
Test();

//actsAsAspect(t,{‘say2‘:{before:function(){alert(‘before‘);},after:function(){alert(‘after‘);}}});

t.say2("hello2");

</script>

由于新浪的编辑器太差了,把eval_r改成eval就可以运行了

支持对Class 和 Object 两种类型的AOP,前者是基于对prototype的修改,后者是对对象的方法修改

时间: 2024-10-13 22:23:03

JS实现AOP的相关文章

JS实现AOP拦截方法调用

//JS实现AOP拦截方法调用function jsAOP(obj,handlers) {    if(typeof obj == 'function'){        obj = obj.prototype;    }    for(var methodName in handlers){        var _handlers = handlers[methodName];        for(var handler in _handlers){            if((hand

js 实现 aop

Aop又叫面向切面编程,用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点,这篇就通过下面这几个小例子,来说说AOP在js中的妙用. 1, 防止window.onload被二次覆盖.2,无侵入的统计代码.3, 分离表单请求和校验.4,给ajax请求动态添加参数.5,职责链模式.6, 组合代替继承. 先给出before和after这2个“切面”函数. 顾名思义,就是让一个函数在另一个函数之前或者之后执行,巧妙的是,before或者after都可以和当前的函数公用th

JS中AOP的实现和运用

在编写js的时候,我们有时会遇到针对某种场景做处理,比如在方法开始的时候校验参数,执行方法前检查权限,或是删除前给出确认提示等等.这些校验方法.权限检测.确认提示,规则可能都是相同的,在每个方法前去调用,显得麻烦,而且不利于统一管理,于是我们想到了面向切面编程(AOP). 1. 简单AOP实现 简单的AOP实现,就是在原函数执行的前后,增加运行before和after两个增强方法,用这个新函数替换原函数,为此,我编写了一个类似于构造器的函数(后文就称它为构造器),代码如下: // originF

aop在js的实现

由于功能上的需求,需要在js的N个方法前执行一些判断代码,M个方法后执行处理代码.如果直接将代码写在具体方法里面增加处理代码,那会导致代码很难维护.对于这个需求,当时想到有2种解决方案. 1.新建一个抽象类,统一入口,然后在入口再分发到具体的方法.但需要对源代码进行不少改动.而且如何分发也是一些问题,如方法参数不一.所以就没坚持这种方案. 2.搬照spring的AOP编程.最后发现是可以实现的. 网上找了一些资料,修改整理了一个util类 Js代码 /* aop工具类 onedear 2011-

js 实现 di

前些时候有使用过AngularJS一些时间,最大的感受就是Angular完全颠覆了我们开发Web应用的方式,自己被其许多耳目一新的设计思想所折服. 首先想说的就是依赖注入(DI),这也意味着,你在使用某一个模块时,不需要去手动require()一下,你需要的模块会自己注入到的函数所在的作用域中,如: JavaScript 1 2 3 4 5 app.service('PersonService', function ($http) {     this.addPerson = function

javascript设计模式与开发实践阅读笔记(2)—— this,闭包与高阶函数

this this总是指向一个对象,有四种情况1. 作为对象的方法调用.2. 作为普通函数调用.3. 构造器调用.4. Function.prototype.call 或Function.prototype.apply 调用. 1. 作为对象的方法调用 当函数作为对象的方法被调用时,this 指向该对象: var obj = { a: 1, getA: function(){ alert ( this === obj ); // 输出:true alert ( this.a ); // 输出:

你相信么,只需一个函数5行JS代码即可在Javascript中实现完整的AOP功能

你相信么,只需一个函数5行JS代码即可在Javascript中实现完整的AOP功能, 你相信么,在JavaScript只需一个函数5行代码即可实现完整的面向方面AOP编程功能.这5行代码的功能包括: 无限层次的函数无害拦截 函数执行前拦截 检查函数的参数值 重新设定函数的参数值 函数执行后拦截 检查函数执行后的返回结果 重新设定函数的返回结果 虽然动态函数式语言的效率是一个存在的问题,但是对于它的高度灵活性,简直让人令人惊叹不已,剧赞. 这个小小的函数源自于和爱明兄的一次讨论:在javascri

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

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

JS模式--装饰者模式(用AOP动态改变函数的参数)

Function.prototype.before = function (beforefn) { var _self = this; return function () { beforefn.apply(this, arguments); return _self.apply(this, arguments); }; }; var func = function (param) { console.log(param); }; func =func.before( function (par