小姜哥的微信

dojo切面编程(dojo/aspect模块)

简介

dojo/aspect提供了切面的编程能力,主要方法before、after、around

方法简介:

after:

1.简介:

在目标对象的某方法执行后执行一个函数,需要返回一个值。

2.方法签名:

after(target, methodName, advisingFunction, receiveArguments);

3.参数说明:

target:目标对象

methodName:目标对象中的方法

advisingFunction:methodName方法执行后执行的方法

receiveArguments:是否只接收原参数,false则advisingFunction的参数methodName的返回值和methodName的arguments, 默认false。

4.特别说明:

advisingFunction的返回值将作为调用methodName的返回值,即after有改变methodName返回值的能力。

before:

1.简介:

在目标对象的某方法执行前执行一个函数,可以有一个返回值。

2.方法签名:

before(target, methodName, advisingFunction);

3.参数说明:

target:目标对象

methodName:目标对象中的方法

advisingFunction:methodName方法执行前执行的方法

4.特别说明:

advisingFunction方法接收的参数为methodName调用时传递的参数

advisingFunction方法可以有一个返回值,该返回值将替换掉调用methodName(或者下一个before)时的参数,即before有改methodName参数的能力。

advisingFunction的返回值需要是一个数组。

around:

1.简介:

拦截目标对象的某方法执行。

2.方法签名:

around(target, methodName, advisingFactory);

3.参数说明:

target:目标对象

methodName:目标对象中的方法

advisingFunction:methodName方法执行前执行的方法

4.特别说明

advisingFunction接收的参数为methodName。

advisingFunction必须返回一个函数。

advisingFunction返回的函数接收的参数为调用methodName时传递的参数。

advisingFunction返回的函数中可以对参数重新处理,之后选择性的调用或者不调用methodName,之后可以处理methodName的返回值。

advisingFunction返回的函数的返回值作为最开始调用methodName的返回值。

总结:

1.before可以修改methodName的参数,methodName一定会执行。

2.after可以修改methodName返回的返回值,methodName一定会执行。

3.around即可以修改methodName的参数又可以修改methodName返回的结果,methodName不一定执行。

around使用示例:

var a = {
f : function (arg1, arg2) {
console.log("log in a.f function : ", arg1, arg2);
return " result in a.f function ";
}

};

aspect.around(a, "f", function (original_function / 原始方法 /
) {
return function (a, b / 原始参数 /
) {
console.log(a, b)
//在调用原始方法前的处理
a = a + "在调用原始方法前的处理";
b = b + "在调用原始方法前的处理";

    var  d  =  original_function(a,  b);
    //在调用原始方法后的处理
    d  =  d  +  "在调用原始方法后的处理";
    return  d;
}

});

var rs = a.f('lala', 'this is b');
console.log(rs)特别注意:

这三个方法均会返回一个带有remove方法的句柄,可以使用该句柄的remove方法删除掉切面方法。如下面的例子仅执行一次切面方法。

var handle = aspect.after(obj, "put", function(){
handle.remove();
});

http://blog.csdn.net/notejs/article/details/8745685

推荐文章

回到顶部