Doge log

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

名前空間作成君

まあjsにNamespaceみたいなのできるのって2.0からなんだろうけど。
今よく使われてるアノコードをなんとかしたいなあと。
dojo.provideを知ってる人は読む必要なしだなあ。
よくあるのって

if (typeof(MochiKit.DOM) == 'undefined') {
    MochiKit.DOM = {};
}

こうやって名前空間(?)というかcontext(?)をぶつからないようにするんだろうけど。
これが長くなってくるとちんたら書いてるのがめんどくさくなってくる。
で普通の人はdojo.provideを使うわけだけどdojoじゃねーひとはめんどくせえ。
というわけでKumuでもdojo.provide的なメソッドを作ってみようという話。
でglobalにアクセスできるようになってないといかんわけだけど方法はid:amachangさんも書いてたけどあの方法しかないのかなあ。dojoも同じだし。

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

Kumu = Kumu.extend(Kumu, {
  
  global : _global,
  /* .........*/

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

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

  _createObjects : function(names, context){
	if(!context){
        return undefined;
    }
    if(typeof(names) == 'string'){
        names = Kumu.toArray(names.split('.'));    
        Kumu._createObjects(names, context);
    }else{
        var name = names.shift();
        if(name){
          context = Kumu._createObj(name, context);
          if(context){
            Kumu._createObjects(names, context);
          }
        }
    }
  },

  namespace : function(path){
    if(path.indexOf('.') == -1){
      return Kumu._createObj(path, _global);
    }
    return Kumu._createObjects(path, _global);    
  },
  /* .... */

使い方としては

//シンプル
Kumu.namespace("hoge.foo.bar");

//dojo.provide("MochiKit.DOM");
//dojo.require("MochiKit.Iter");

//上記と同じ
Kumu.namespace("MochiKit.DOM");
Kumu.dynamicLoad("MochiKit.Iter");

hoge[foo][bar]やMochiKit[DOM]を作成。
一応作られたobjは_nameで名前空間の文字列も取得できるようにしてみた。
一応、先人達といろいろぶつからないように気を配れるようにしておかないとね。
うくく。