メソッドのフック
Posted feedbacks - JavaScript
こんなでいいですか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function addHock(obj, method_name, before, after) {
var orignal = obj[method_name];
obj[method_name] = function() {
var error, ret;
before.apply(this, arguments);
try {
ret = orignal.apply(this, arguments);
} catch (e) {
error = e;
}
after.call(this, arguments, ret, error);
if (error) throw error;
return ret;
};
return orignal;
}
addHock(String.prototype, "split",
function(ptn){alert("split:"+ptn);},
function(args,ret,e){alert("return:"+ret);});
"hogehoge".split("g");
|
Functionを拡張すれば簡単なはずだ、という当初の妄念が色濃く残ったコードと相成りました。
Linux版のFirefox,同Opera weekly buildで動作を確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | String.prototype.hook=function(fnBefore,fnAfter,scopeMagic){
var target=this;
var str=[
"var orig=",target,";\n",
target,"=function(){\n",
,((fnBefore) ? ["(",fnBefore,").apply(this,arguments);"].join("") : ""),
,"\nvar ret=orig.apply(this,arguments);\n",
,((fnAfter) ? ["(",fnAfter,").apply(this,arguments);"].join("") : ""),
"\nreturn ret;}"
].join("")
if(scopeMagic){
eval(str.replace(new RegExp(target,"g"),"scopeMagic"));
return scopeMagic;
}else{
eval(str);
}
}
// グローバル空間
var aa=[3,2,4];
"aa.sort".hook(
function(){
alert("global: before: "+this);
}
,function(){
alert("global: after: "+this);
}
);
aa.sort();
// どっかのスコープ内
(function(){
var a=[1,6,2,3];
a.sort="a.sort".hook(
function(){
alert("before: "+this);
}
,function(){
alert("after: "+this);
}
,a.sort
);
a.sort();
})();
|


todogzm
#6017()
Rating0/8=0.00
例えば、あるクラスのあるメソッドを実行する前に他の処理を呼びたい(例えばログやトランザクション開始など)。 また、そのメソッドの終了後にも何らかの後処理を呼びたい(トランザクション終了など)。
そのような、メソッドに対するフック処理を書いてください。 ライブラリを使用してメソッドのフックを実現した場合は ライブラリの名前を紹介してくれると助かります。
[ reply ]