Javascript 网站名称空间设置和页面特定对象的建议';s等

Javascript 网站名称空间设置和页面特定对象的建议';s等,javascript,jquery,ruby-on-rails,Javascript,Jquery,Ruby On Rails,我想创建一个名称空间或全局对象来保存站点范围内使用的函数等 另外,在特定页面上,我希望创建一个对象,该对象将基于当前页面保存状态,如果用户已登录,如果是,则我将基于当前用户提取状态信息 建议的模式是什么?您可能可以声明一个名为base.js的基本javascript文件,并定义各种名称空间,如下所示 基命名空间 yourcompany.Projectname = {}; yourcompany.Projectname.modules = {}; yourcompany.Projectname.c

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

另外,在特定页面上,我希望创建一个对象,该对象将基于当前页面保存状态,如果用户已登录,如果是,则我将基于当前用户提取状态信息


建议的模式是什么?

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

基命名空间

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

然后在每个javascript文件中,您可以使用上述名称空间创建函数

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

yourcompany.Projectname = {};
yourcompany.Projectname.modules = {};
yourcompany.Projectname.components = {};
有几个库可以处理依赖关系管理和脚本加载,但我现在不打算讨论这些:

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

创建名称空间:

在最基本的层面上,这很容易做到:

window["MyOrg"] = {};
通常,基本对象没有任何数据或函数,而是由子模块组成。创建子模块的最基本形式实际上是相同的:

MyOrg.submodule = {}
您可以将此模式扩展到任何级别。e、 g.
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.submodule.setVar(2);
MyOrg.submodule.getVar(); // 2

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

首先,您可以在服务器端添加并生成javascript,其中包含已烘焙的相关数据

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

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

请注意,除非您已经定义了
var yourcompany={}-否则,这里的第一行将显示错误。
$.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)
   }
});