论坛首页 Web前端技术论坛

简洁优雅的JS AOP实现

浏览 8829 次
精华帖 (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
   发表时间:2007-04-05  
js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码
0 请登录后投票
   发表时间:2007-04-05  
dennis_zane 写道
js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码


有些价值的,比如 把ajax的回调函数里面做AOP统一处理
0 请登录后投票
   发表时间:2007-04-06  
第25行 this.rv[method] = original.apply(this, arguments);

这里面的this.rv[method]是做什么的呀? @_@
0 请登录后投票
   发表时间:2007-04-06  
保留object原来的方法执行后的返回值
0 请登录后投票
   发表时间:2007-04-06  
dennis_zane 写道
js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码


自定义事件。比如我编写了一个复杂的Grid控件,但无法事先预计哪些方法需要触发事件。这种情况下,你可以直接拦截控件的某些方法来模拟事件处理了。
0 请登录后投票
   发表时间:2007-04-06  
hexiaodong 写道
dennis_zane 写道
js层面的AOP有什么实际的应用价值呢?不过不失为一段优雅的JS代码


自定义事件。比如我编写了一个复杂的Grid控件,但无法事先预计哪些方法需要触发事件。这种情况下,你可以直接拦截控件的某些方法来模拟事件处理了。


有道理,看了你给的链接,值的好好读读
0 请登录后投票
   发表时间: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);
  };
}
0 请登录后投票
   发表时间:2007-04-07  
在EXT中AOP屡见不鲜
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics