浏览 8839 次
锁定老帖子 主题:简洁优雅的JS AOP实现
精华帖 (0) :: 良好帖 (6) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-05
<script> function Test(){ this.say1 = function(s){ alert(s); } this.say2 = function(s){ alert(s); } } function actsAsAspect(object) { object.yield = null; object.rv = { }; object.before = function(method, f) { var original = eval("this." + method); this[method] = function() { f.apply(this, arguments); return original.apply(this, arguments); }; }; object.after = function(method, f) { var original = eval("this." + method); this[method] = function() { this.rv[method] = original.apply(this, arguments); return f.apply(this, arguments); } }; object.around = function(method, f) { var original = eval("this." + method); this[method] = function() { this.yield = original; return f.apply(this, arguments); } }; } function beforeHander(s){ alert("aspect said:"); } function afterHander(s){ alert("said by aspect"); } var t = new Test(); actsAsAspect(t); t.before("say1",beforeHander); t.after("say2",afterHander); test = function(){ t.say1("hello1"); t.say2("hello2"); } test(); </script> actsAsAspect 函数来自 http://beppu.lbox.org/articles/2006/09/06/actsasaspect 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-05
js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码
|
|
返回顶楼 | |
发表时间:2007-04-05
dennis_zane 写道 js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码
有些价值的,比如 把ajax的回调函数里面做AOP统一处理 |
|
返回顶楼 | |
发表时间:2007-04-06
第25行 this.rv[method] = original.apply(this, arguments);
这里面的this.rv[method]是做什么的呀? @_@ |
|
返回顶楼 | |
发表时间:2007-04-06
保留object原来的方法执行后的返回值
|
|
返回顶楼 | |
发表时间:2007-04-06
dennis_zane 写道 js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码
自定义事件。比如我编写了一个复杂的Grid控件,但无法事先预计哪些方法需要触发事件。这种情况下,你可以直接拦截控件的某些方法来模拟事件处理了。 |
|
返回顶楼 | |
发表时间:2007-04-06
hexiaodong 写道 dennis_zane 写道 js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码
自定义事件。比如我编写了一个复杂的Grid控件,但无法事先预计哪些方法需要触发事件。这种情况下,你可以直接拦截控件的某些方法来模拟事件处理了。 有道理,看了你给的链接,值的好好读读 |
|
返回顶楼 | |
发表时间:2007-04-06
dennis_zane 写道 hexiaodong 写道 dennis_zane 写道 js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码
自定义事件。比如我编写了一个复杂的Grid控件,但无法事先预计哪些方法需要触发事件。这种情况下,你可以直接拦截控件的某些方法来模拟事件处理了。 有道理,看了你给的链接,值的好好读读 这个 链接里面还有个 The Decorator Pattern for JavaScript 也不错 function actsAsDecorator(object) { object.setupDecoratorFor = function(method) { if (! ('original_' + method in object) ) { object['original_' + method] = object[method]; object['before_' + method] = [ ]; object['after_' + method] = [ ]; object[method] = function() { var i; var b = this['before_' + method]; var a = this['after_' + method]; var rv; for (i = 0; i < b.length; i++) { b[i].call(this, arguments); } rv = this['original_' + method](arguments); for (i = 0; i < a.length; i++) { a[i].call(this, arguments); } return rv; } } }; object.before = function(method, f) { object.setupDecoratorFor(method); object['before_' + method].unshift(f); }; object.after = function(method, f) { object.setupDecoratorFor(method); object['after_' + method].push(f); }; } |
|
返回顶楼 | |
发表时间:2007-04-07
在EXT中AOP屡见不鲜
|
|
返回顶楼 | |