| /* // Aop ({options }); // By: adamchow2326@yahoo.com.au // Version 1.0 // Simple aspect oriented programming module // Support Aspect before, after and around // Usage: Aop ({ Context: myObject, // scope context of the target function. Target: "test", // target function name Before: function () {// before function will be run before the target function Console. log ("aop before "); }, After: function () {// after function will be run after the target function Console. log ("aop after "); }, Around: function () {// around function will be run before and after the target function Console. log ("aop around "); } }); */ Var aop = (function (){ Var options = {}, Context = window, OFn, OFnArg, TargetFn, TargetFnSelector, BeforeFn, AfterFn, AroundFn, CloneFn = function (Fn ){ If (typeof Fn = "function "){ Return eval ('[' + Fn. toString () + ']') [0]; } Return null; }, CheckContext = function (){ If (options. context ){ Context = options. context; } If (typeof context(options.tar get). name] = "function "){ TargetFnSelector = (options.tar get). name; TargetFn = context [targetFnSelector]; } Else if (typeof context=options.tar get] = "function "){ TargetFnSelector = options.tar get; TargetFn = context [targetFnSelector]; } If (targetFn ){ OFn = cloneFn (targetFn ); OFnArg = new Array (targetFn. length ); Return true; } Else { Return false; } }, Run = function (){ Context [targetFnSelector] = function (oFnArg ){ If (aroundFn ){ AroundFn. apply (this, arguments ); } If (beforeFn ){ BeforeFn. apply (this, arguments); // 'shanghai' is context } OFn. apply (this, arguments ); If (afterFn ){ AfterFn. apply (this, arguments); // 'easy' is context } If (aroundFn ){ AroundFn. apply (this, arguments ); } }; }; Return function (opt ){ If (opt & typeof opt = "object "&&! Opt. length ){ Options = opt; If (options.tar get & checkContext ()){ If (options. before & typeof options. before = "function "){ BeforeFn = options. before; } If (options. after & typeof options. after = "function "){ AfterFn = options. after; } If (options. around & typeof options. after = "function "){ AroundFn = options. around; } Run (); } } }; })(); // Test examples // ----------------- Aop modify global function ---------------// Function test (name, age ){ Console. log ("test fn. name =" + name + "age:" + age ); } Aop ({ Target: "test ", Before: function (){ Console. log ("aop before "); }, After: function (){ Console. log ("aop after "); }, Around: function (){ Console. log ("aop around "); } }); // Run Test ("adam", 6 ); // ----------------- Aop test modify method in an object ---------------// Var myobj = { MyName: "testName ", SayName: function (){ Console. log (this. myName ); }, ChildObj :{ Age: 6, Say: function (){ Console. log (this. age ); } } }; Aop ({ Context: myobj, Target: "sayName ", Before: function (){ Console. log ("aop before say name =" + this. myName ); }, After: function (){ Console. log ("aop after say name =" + this. myName ); }, Around: function (){ Console. log ("aop around say name =" + this. myName ); } }); // Run Myobj. sayName (); Aop ({ Context: myobj. childObj, Target: "say ", Before: function (){ Console. log ("aop before say name =" + this. age ); }, After: function (){ Console. log ("aop after say name =" + this. age ); }, Around: function (){ Console. log ("aop around say name =" + this. age ); } }); Myobj. childObj. say (); |