标签:工作 apply 代码 注意 原函数 sel func div 接下来
Function.prototype.before = function( beforefn ){ var __self = this; // 保存原函数的引用 return function(){ // 返回包含了原函数和新函数的"代理"函数 beforefn.apply( this, arguments ); // 执行新函数,且保证 this 不被劫持,新函数接受的参数 // 也会被原封不动地传入原函数,新函数在原函数之前执行 return __self.apply( this, arguments ); // 执行原函数并返回原函数的执行结果, // 并且保证 this 不被劫持 } } Function.prototype.after = function( afterfn ){ var __self = this; return function(){ var ret = __self.apply( this, arguments ); afterfn.apply( this, arguments ); return ret; } };
Function.prototype.before 接受一个函数当作参数,这个函数即为新添加的函数,它装载了
新添加的功能代码。
接下来把当前的 this 保存起来,这个 this 指向原函数,然后返回一个“代理”函数,这个
“代理”函数只是结构上像代理而已,并不承担代理的职责(比如控制对象的访问等)。它的工作
是把请求分别转发给新添加的函数和原函数,且负责保证它们的执行顺序,让新添加的函数在原
函数之前执行(前置装饰),这样就实现了动态装饰的效果。
我们注意到,通过 Function.prototype.apply 来动态传入正确的 this ,保证了函数在被装饰
之后, this 不会被劫持。
Function.prototype.after 的原理跟 Function.prototype.before 一模一样,唯一不同的地方在
于让新添加的函数在原函数执行之后再执行。
值得提到的是,上面的 AOP实现是在 Function.prototype 上添加 before 和 after 方法,但许
多人不喜欢这种污染原型的方式,那么我们可以做一些变通,把原函数和新函数都作为参数传入
before 或者 after 方法:
var before = function( fn, beforefn ){ return function(){ beforefn.apply( this, arguments ); return fn.apply( this, arguments ); } } var a = before( function(){alert (3)}, function(){alert (2)} ); a = before( a, function(){alert (1);} ); a();
标签:工作 apply 代码 注意 原函数 sel func div 接下来
原文地址:https://www.cnblogs.com/TTblog5/p/13168174.html