javascipt的AOP

很多实现了,基于jquery和prototype的都有。

http://code.google.com/p/jquery-aop/
http://ajaxian.com/archives/eventobservemethod-more-aop-for-javascript
http://code.google.com/p/ajaxpect

 

PS:基于prototype的http://___.constantology.com/observe_method/  不能访问,提供http://___.constantology.com/download/observe_method/observemethod.js 的缓存内容。

 

Object.extend(Event, {
			AFTER : 'after',
			AROUND : 'around',
			BEFORE : 'before',
			observeMethod : function(scope, method, callback, aspect) {
				scope.listeners = $H(scope.listeners || {});
				if (!scope.listeners[method]) {
					scope.listeners[method] = this.setAspects();
					var __method = scope[method];
					scope[method] = function() {
						Event.dispatchCustomEvent(scope,
								scope.listeners[method].before, arguments);
						Event.dispatchCustomEvent(scope,
								scope.listeners[method].around, arguments);
						var args = $A(arguments);
						var r = __method.apply(scope, arguments);
						args.push(r);
						Event.dispatchCustomEvent(scope,
								scope.listeners[method].around, args);
						Event.dispatchCustomEvent(scope,
								scope.listeners[method].after, args);
						return r;
					}.bind(scope);
				}
				aspect = aspect || this.AFTER;
				if (scope.listeners[method][aspect].indexOf(callback) < 0)
					scope.listeners[method][aspect].push(callback);
			},
			purgeMethodListeners : function(scope) {
				if (arguments.length > 0) {
					if (arguments.length > 1)
						scope.listeners[arguments[1]][arguments[2]] = [];
					else
						scope.listeners[arguments[1]] = this.setAspects();
				} else
					scope.listeners.each(function(listener) {
								listener = this.setAspects();
							}.bind(this));
			},
			stopObserveMethod : function(scope, method, callback, aspect) {
				aspect = aspect || this.AFTER;
				scope.listeners[method][aspect] = scope.listeners[method][aspect]
						.without(callback);
			},
			dispatchCustomEvent : function(scope, events, argv) {
				var args = argv;
				if (events instanceof Array)
					events.each(function(func) {
								func.apply(this, args);
							}.bind(scope));
				else
					events.apply(scope, args);
			},
			setAspects : function() {
				return {
					after : [],
					around : [],
					before : []
				};
			}
		});

 

具体调用:

var myFunc = function() { alert( 'hello world!' ); }; 
var myOtherFunc = function() { alert( 'total annihilation of world is inevitable!' ); }; 
Event.observeMethod( window, 'myFunc', myOtherFunc ); 

var myNewFunc = function() { alert( 'i hate corporatocracies!' ); }; 
var myBeforeFunc = function() { alert( 'yes it\'s true!' ); }; 
Event.observeMethod( window, 'myNewFunc', myBeforeFunc, Event.BEFORE ); 

 

 

你可能感兴趣的:(JavaScript,AOP,jquery,prototype,Google)