challenge メソッドのフック

例えば、あるクラスのあるメソッドを実行する前に他の処理を呼びたい(例えばログやトランザクション開始など)。 また、そのメソッドの終了後にも何らかの後処理を呼びたい(トランザクション終了など)。

そのような、メソッドに対するフック処理を書いてください。 ライブラリを使用してメソッドのフックを実現した場合は ライブラリの名前を紹介してくれると助かります。

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();
})();

Index

Feed

Other

Link

Pathtraq

loading...