Ste*_*son 2 javascript aop prototype function function-prototypes
我想为JavaScript函数做一个类似AOP的"之前"功能.
所以我寻找现有的解决方案,找到了jQuery的aop-plugin.不幸的是,插件只是包装给定的功能.因此,在增强函数之前指向原始函数的任何对象仍然指向原始函数.从这些对象调用该函数会调用该函数的非增强版本.
我想改变函数对象本身,而不是用其他函数包装函数,所以以前的引用不会导致意外的行为.所以我有这样的事情:
(function(){}).constructor.prototype.before = function(beforeFunction){
this.beforeFunction = beforeFunction;
};
/* some magic should happen here: enhance call? */
function logFoo() {
console.log("Foo");
};
function logBar() {
console.log("Bar");
};
logFoo(); // logs "Foo"
logFoo.before(logBar);
logFoo(); // should log "Bar", then "Foo"
Run Code Online (Sandbox Code Playgroud)
所以问题是,当调用增强函数时,如何调用beforeFunction?
函数的主体,参数和引用环境是不可变的,因此无法增强函数,只能创建新函数.
你可以从头开始增强你的功能,如下所示:
Function.prototype.enhanceable = function() {
var original = this,
enhanced = [],
ret = function() {
for( var i = 0; i < enhanced.length; ++i ) {
enhanced[i].apply( this, arguments );
}
return original.apply( this, arguments );
};
ret.before = function( fn ) {
enhanced.push( fn );
};
return ret;
};
Run Code Online (Sandbox Code Playgroud)
然后:
var logFoo = function() {
console.log( "foo" );
}.enhanceable();
var logBar = function() {
console.log( "bar" );
};
logFoo(); //foo
logFoo.before( logBar );
logFoo(); //logs bar, then foo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |