建议网站的命名空间设置,页面特定的对象等

时间:2011-04-17 23:47:10

标签: javascript jquery ruby-on-rails

我想创建一个名称空间或全局对象,它将保存站点范围内使用的函数等。

此外,在特定页面上,我想创建一个基于当前页面保持状态的对象,如果用户已登录,如果是,那么我将根据当前用户提取状态信息。

这是什么建议模式?

2 个答案:

答案 0 :(得分:7)

JavaScript没有名称空间。但是,当我们大多数人在JavaScript的上下文中引用名称空间时,我们真正的意思是以模块化的方式将我们的函数和数据存储在对象中,而不会混淆全局上下文。

有几个库处理依赖关系管理和脚本加载,但我现在不打算讨论任何一个:

要创建命名空间,必须首先在全局上下文中创建一个对象。

创建命名空间:

在最基本的层面上,这很简单:

window["MyOrg"] = {};

通常,您的基础对象不具有任何数据或功能,而是由子模块组成。创建子模块的最基本形式几乎相同:

MyOrg.submodule = {}

您可以将此模式扩展到您想要的任何级别。例如MyOrg.submodule.tools.usefulFunction


注意:如果要在可以以任意顺序加载的不同文件中定义模块和子模块,则必须首先检查您的命名空间(以及任何父模块)是否存在1)定义模块时没有出错,2)所以你不要覆盖任何模块,而是增加它们。

例如,如果您要定义MyOrg.submodule模块,则需要包括:

var MyOrg = MyOrg || {};
MyOrg.submodule = MyOrg.submodule || {};

现在您已经设置了子模块,您可以使用预期的符号轻松地为其分配成员:

MyOrg.submodule.add = function (x, y) {
   return x + y;
}

MyOrg.submodule.CONSTANT = 42;

如果您可以保证您是第一次定义子模块(没有覆盖任何东西的风险),您也可以使用:

MyOrg.submodule = {
   add: function (x, y) {
      return x + y;
   },
   CONSTANT: 42
};

“高级”方法

好的,你应该得到它的要点。但是,您可以遵循稍微更高级的模式,尤其是“模块模式:”

MyOrg = MyOrg || {};
MyOrg.submodule = (function () {
    /* any variables (incl. functions) in here are effectively private -- they 
       cannot be accessed or modified unless they are explicitly exposed. */
    var privateVariable = 42; 

    /* We return an object that will define the public API. Functions defined 
       in this object still have access to our "private" scope */
    return {
       getVar: function () {
          return privateVariable;
       },
       setVar: function (value) {
          privateVariable = value;
       }
    };
})();

您使用相同的符号表示模块,但具有私有变量和函数的额外好处:

MyOrg.submodule.setVar(2);
MyOrg.submodule.getVar(); // 2

关于你的第二个问题,有几种方法可以做到这一点。

首先,您可以在服务器端添加生成javascript,并将相关数据添加到其中。

var MyOrg = MyOrg || {};
MyOrg.userInfo = {
   userName: "<%= @user.user_name %>",
   location: "<%= @user.location %>"
   //etc.
}

您也可以使用AJAX和JSON

从客户端从服务器获取它
$.ajax({
   url: "user/getInfo", 
   success: function (data) {
      // data is an object created from a JSON string containing info for the
      // current user, presumably using session data.

      alert(data.userName)
   }
});

如果您使用此方法,则可能必须在用户模块中使用回调来获取相关信息,或者您可以实现缓存方法(除了创建这么多服务器请求之外还有其他好处)。

答案 1 :(得分:1)

您可以声明一个名为base.js的基本javascript文件,并定义各种名称空间,如下所示

基本命名空间

yourcompany.Projectname = {};
yourcompany.Projectname.modules = {};
yourcompany.Projectname.components = {};

然后在每个javascript文件中,您可以使用上述命名空间

创建函数