为了帮助大家网页设计师考试基础知识,我们考吧网特为广大考生整理关于javascript知识精选资料,希望广大考生能够喜欢。想了解更多资讯请继续关注我们考吧,同时也欢迎来我站学习。
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知)、after(后置通知)、around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被严重忽视的技术点。但是利用aop可以有效的改善js代码逻辑,比如前端框架dojo和yui3中AOP则被提升至自定义事件的一种内在机制,在源码中随处可见。得益于这种抽象使得dojo的自定义事件异常强大和灵活。dojo中aop的实现在dojo/aspect模块中,主要有三个方法:before、after、around,本文会带领大家一步步实现around方法,后续文章将会深入解析dojo/aspect模块的结构体系。
js要实现环绕通知,最简单也最应被想到的就是利用callback(回调)
?
1
2
3
4
5
6
7
8
9
10
11
|
advice = function(originalFunc){
console.log("before function");
originalFunc();
console.log("after function");
}
var obj = {
foo: function(){
console.log('foo');
}
}
advice(obj.foo)
|
结果:
before function
foo
after function
哈哈,太简单了,是不是可以回去睡觉了。。。。
可是,是不是有点太粗糙了。。。。说好的环绕呢。。。。至少下次调用obj.foo也应该是这个结果,而不是一个干巴巴的“foo”;为此我我们需要在改动一下,利用一下闭包
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
advice = function(originalFunc){
return function() {
console.log("before function");
originalFunc();
console.log("after function");
}
}
var obj = {
foo: function(){
console.log(this.name);
},
name: "obj"
}
obj.foo = advice(obj.foo)
obj.foo()
|
输出:
before function
after function
看起来达到了环绕的效果,but说好的name哪去了。。。。
在advice返回的闭包中我们还要处理作用域问题
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
advice = function(originalFunc){
return function() {
console.log("before function");
originalFunc();
console.log("after function");
}
}
var obj = {
foo: function(){
console.log(this.name);
},
name: "obj"
}
keepContext = function() {
return obj['foo'].call(obj);
}
obj.foo = advice(keepContext);
|
看起来是利用call解决了作用域问题,我们运行一下看看:
编辑推荐: