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"
問題は、強化された関数が呼び出されたときに beforeFunction を呼び出すにはどうすればよいかということです。