很多实现了,基于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 );