型検査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);