Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

jsでjavaのpackageのようにアクセスする

DWRのような要は

hoge.foo.bar('test');

みたいな呼び方を簡単にする方法はないものかという話なんだけど。
こんなの書いてみた。

var _global = (function (){return this;})();

/* .... 適当な名前なので任意で..... */
var $ = {
  
  global : _global,
  /* .........*/

  isUndef : function(name, obj){
    return (typeof obj[name] == "undefined");
  },

  _createObj : function(name, obj){
    return (obj && !$.isUndef(name, obj) ? obj[name] : (obj[name] = {_name : (obj._name) ? obj._name+'.'+name : name}));
  },

  _createFunction : function(name, obj, func){
    func_name = name;
    return (obj && !$.isUndef(name, obj) ? obj[name] : (obj[name] = func));
  },

  _createObjects : function(names, context, func){
	if(!context){
        return undefined;
    }
    if(typeof(names) == 'string'){
        names = $.toArray(names.split('.'));    
        $._createObjects(names, context, func);
    }else{
        var name = names.shift();
        if(name){
          if(name.length == 0 && func){
              $._createFunction(names, context, func);
          }else{
            context = $._createObj(name, context);
            if(context){
              $._createObjects(names, context, func);
            }
          }
        }
    }
  },

  create : function(path, func){
    if(path.indexOf('.') == -1){
      return $._createObj(path, _global);
    }
    return $._createObjects(path, _global, func);    
  },
}
$.create('hoge.foo.bar');
//Object
alert(hoge.foo.bar);
var test = fuction(){alert('test');};

$.create('hoge.foo.hoge', test);

イメージはこんな感じ。
で更に

Function.prototype.instance = function(name){
  $.create(name, this);
}

ここまでくると

var f = function(){
  /* .... ajaxなこと... */
}
f.instance('foo.bar');
//fが呼ばれる
foo.bar();

となる。
これはどーいったときに使うかなんだけどserver側のモジュール名でそのまま呼べますよ的な使い方をしたいときに使うわけ。
主にAjax用なんだけどね。
まああんまし流行らないかな、この呼び方は。
うくく。