很多实现了,基于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 );
本文介绍了一种在Prototype JavaScript库中实现面向切面编程(AOP)的方法。通过扩展Event对象,实现了方法级别的前置、环绕和后置通知。此外,还提供了如何使用该实现的具体示例。
524

被折叠的 条评论
为什么被折叠?



