関数のtrace
http://d.hatena.ne.jp/amachang/20070517/1179427742
http://blog.livedoor.jp/dankogai/archives/50833481.html
とかスマートだなあと思いつつ。
昔なんかやったよなあとか思ったらあった。
Kumuでコメントアウトにしてる部分だね。
元々AOPみたいなの作ってたんだな。
抜粋してちょっと直すとこんな感じ。
beginTrace = function(args, func){ var funcstr = func.toString(); var ret = funcstr.match(/[0-9A-Za-z_]+\(/).toString(); ret = ret.substring(0,ret.length-1); var str = "START function : ["+ret+"] : prameter : ["; for(var i = 0; i < args.length; i++){ str += args[i].toString(); str += ' : '; } str += ']'; try { var br = document.createElement("br"); var span = document.createElement("span"); document.body.appendChild(br); document.body.appendChild(span.appendChild(document.createTextNode(str))); } catch (e) { } return args; } endTrace = function(result, args, func){ var funcstr = func.toString(); var ret = funcstr.match(/[0-9A-Za-z_]+\(/).toString(); ret = ret.substring(0,ret.length-1); var str = "END function : ["+ret+"] : result : ["+result+"] : prameter : ["; for(var i = 0; i < args.length; i++){ str += args[i].toString(); str += ' : '; } str += ']'; try { var br = document.createElement("br"); var span = document.createElement("span"); document.body.appendChild(br); document.body.appendChild(span.appendChild(document.createTextNode(str))); } catch (e) { } return result; } addBefore = function(func, before) { var addfunc = function() { return func.apply(this, before(arguments, func)); }; addfunc.__proto__ = func; addfunc.toString = function() { return addfunc.__proto__.toString(); }; return addfunc; } addAfter = function(func, after) { var addfunc = function() { return after(func.apply(this, arguments), arguments, func); }; addfunc.__proto__ = func; addfunc.toString = function() { return addfunc.__proto__.toString(); }; return addfunc; } addAround = function(func, around) { var addfunc = function() { return around(arguments, func); }; addfunc.__proto__ = func; addfunc.toString = function() { return addfunc.__proto__.toString(); }; return addfunc; } trace = function(target){ if(typeof(target) == "function" ){ obj = this.addBefore(target, this.beginTrace); obj = this.addAfter(obj, this.endTrace); target = obj; return target; }else{ for(var i in target){ var obj = target[i]; if(typeof(obj) == "function" ){ obj = this.addBefore(obj, this.beginTrace); obj = this.addAfter(obj, this.endTrace); target[i] = obj; } } } } Function.prototype.trace = function(){ return trace(this); }
使い方は同じ
function add(x,y){ return x + y } add = add.trace('add'); add(1,1);
実行すると以下のようなログをbodyの後ろに追加で吐き出す
START function : [関数名] : prameter : [パラメータ番号:値] END function : [関数名] : result : [実行結果] : [パラメータ番号:値]
さらにobjectを渡すとそのfunctionに関しても一括でtraceをかけれたりする。
まあこんなの長いし誰も見ないだろう。
うくく。