如何在javascript中定义全局命名空间

时间:2013-08-09 07:10:21

标签: javascript jquery namespaces

有没有办法定义全局命名空间,以便我可以从我的所有页面调用此命名空间中的函数?

例如

//在一个文件中我定义下面的代码

DefineNameSpace("my.namespace.api", { 
    addObject: function(obj) {
         // store obj into indexDB
    },
    readAllObject: function() {
         // return array of object from indexdb
    }
})

//这样我可以在另一个javascript文件中

my.namespace.api.addObject({name: "foo", desc: "bar"});

有没有办法实现" DefineNameSpace"方法

由于

2 个答案:

答案 0 :(得分:3)

这样做的一种方法很简单,就是:

my = {
   namespace: {
      api : {}
   }
}

my.namespace.api.addObject = function (obj) { }

你实际上是在创建对象,但这样它也可以作为名称空间使用:)

这不是你正在实施的方法。但是使用方法构建命名空间需要在加载脚本文件之前调用函数,其中使用命名空间,否则在调用DefineNamespace方法之前调用这些代码行,并且您将遇到部分名称空间在那一点上是不确定的。上面的解决方案并非如此,但不幸的是它不是动态的。

答案 1 :(得分:1)

动态构建命名空间可以通过以下方式完成:

// the root of the namespace would still be handy to have declared here
var my = {};

function defineNamespace(namespaceStr) {
   var namespaceSegments = namespaceStr.split(".");
   var namespaceSoFar = null;

   // iterate through namespace parts
   for (var i = 0; i < namespaceSegments.length; i++) {
      var segment = namespaceSegments[i];

      if (i == 0) {
          // if namespace starts with my, use that
          if (segment == "my") { 
              // set pointer to my
              namespaceSoFar = my;
          }
          else {
          // create new root namespace (not tested this, but think this should work)
              var otherNamespace = eval(segment);
              if (typeof otherNamespace == "undefined") {
                 eval(segment + " = {};");
              }
              // set pointer to created root namespace
              namespaceSoFar = eval(segment);
          }  
      }
      else {
          // further build the namespace
          if (typeof namespaceSoFar[segment] == "undefined") {
              namespaceSoFar[segment] = {};
          }
          // update the pointer (my -> my.namespace) for use in the next iteration
          namespaceSoFar = namespaceSoFar[segment];
      }
   }
}