型検査7
解析後の動作を関数化して渡す版。これで作ったbefore()をwrap()に渡せば少し軽くなる。
var makeBefore = function(original){ var re = /function(?:\s+[a-z$_]+)?\s*\(\s*((?:[a-z$_]+\s*)(,\s*[a-z$_]+\s*)*)?\)/i; var str = original.toString().match(re)[1];//引数名を取り出す var types = []; // if(str) { var argStrs = str.split(","); for(var i=0; i<argStrs.length; i++){ var index = argStrs[i].indexOf("$"); if(index>=0){ types[types.length] = argStrs[i].substring(index+1,argStrs[i].length);//型を切り出す。 } else { types[types.length] = null;//型がない場合はnull } } } // return function(orig,args){ for(var i=0; i<args.length; i++){ if(types[i]!=null){ var type = typeof(args[i]); if(type=='object'){ if(! args[i] instanceof eval(types[i])){//型名と型の対応は実行時に付ける。 throw "TypeError"; } } else if(type==types[i]){ throw "TypeError"; } } } return; }; }