型検査2
少し簡略化して「変数名$型名」という形式にしてみた。
var before = function check(original,args,result){ var re = /function(?:\s+[a-z$_]+)?\s*\(\s*((?:[a-z$_]+\s*)(,\s*[a-z$_]+\s*)*)?\)/i; var str = original.toString().match(re)[1];//引数名を取り出す if(str){ var argStrs = str.split(","); for(var i=0; i<argStrs.length;i++){ var index = argStrs[i].indexOf("$"); if(index>=0){ var cond = argStrs[i].substring(index+1,argStrs[i].length); //空白除去も必要かも var type = typeof(args[i]); if(type == "object"){ if(!args[i] instanceof eval(cond)){ throw "TypeError"; } } else if(type != cond){ throw "TypeError"; } } } } } var obj = { _x:"X", setX:function(x$number){this._x = x$number;} }; obj.setX = wrap(obj.setX,before); obj.setX(2);