【问题标题】:declaring with and without the namespace声明有和没有命名空间
【发布时间】:2013-01-10 01:52:39
【问题描述】:

我正在玩 Todo MVC 应用程序 http://addyosmani.github.com/todomvc/ 并注意到一些东西,我不确定这是设计完成的(这是必要的)或者它只是随机的。作者似乎对Backbone和js颇有经验,在声明Router(var Workspace)和Collection(var TodoList)时使用'var',然后在实例化时将它们带入app命名空间,例如,

app.TodoRouter = new Workspace();

但是,例如,当他声明视图时,他不使用 var,而是直接使用命名空间。他也对模型执行此操作。例如,

app.TodoView = Backbone.View.extend({

});

无需检查所有代码,是否有更高层次的原因导致我遗漏了该决定,还是只是任意的

代码

查看

app.TodoView = Backbone.View.extend({

});

路由器

var Workspace = Backbone.Router.extend({

});

app.TodoRouter = new Workspace();

收藏

var TodoList = Backbone.Collection.extend({

});

// Create our global collection of **Todos**.
app.Todos = new TodoList();

【问题讨论】:

  • 我认为您看到了一种奇怪的命名实践(实例和“类”/原型的大写相同)和合理信息隐藏的组合。路由器实例app.TodoRouter 可能在其他地方需要,但“类”Workspace 不是,所以你看到var Workspace 将其隐藏在本地范围内; app.TodoView 可能在其他地方需要,因此它可以在全球范围内访问。 “个人偏好”可能是最接近您得到答案的内容。

标签: backbone.js


【解决方案1】:

代码使用命名空间,他使用app 作为与全局命名空间关联的唯一变量。 大多数时候,你会看到一些东西:

var app = {};  /** local */
window.app = app;  /** assign variable to global scope */

app 现在是您可以定义变量的地方,您在其中定义的任何内容都可以在app 命名空间内的任何位置访问。

所以现在,您可以定义各种子命名空间来保持代码整洁并更易于查找。最有可能出于组织目的,避免变量冲突并且不要混淆变量。你可以做这样的事情,它为整个应用程序提供结构。

app = {
    Utilities: {},
    Views: {},
    Collections: {}
};

你也可以随时在里面定义变量,比如。

app.Models = {};

现在window(或全局命名空间)中的所有位置都没有variables,而是在app 中定义,并且可以通过app.Utilities.doSomething(); 访问

在 app 命名空间之外定义的任何其他内容(例如 var router = new AppRouter( {}) 作为局部变量)都已定义,并且只能在声明它的函数范围内使用。它们只能使用一次,并且它们' re 不打算在代码中的其他任何地方(当前范围之外)使用。

【讨论】:

    【解决方案2】:

    我相信他本质上只是将需要的内容附加到命名空间对象。

    所以在这种情况下,TodoView 是一个构造函数,每次添加一个待办事项项时都需要它来创建一个新视图。而路由器构造函数只用于创建一个单独的路由器实例,所以它只在本地范围内创建,并且使用一次来创建app.TodoRouter。集合也是如此,构造函数被使用一次来创建单实例 app.Todos,然后超出范围。如果在需要多个 TodoList 实例的情况下,您还需要将构造函数附加到应用程序对象 (app.TodoList)。

    javascript 中的一个常见命名约定是对构造函数使用 pascal 大小写(首字母大写),对实例使用驼峰式大小写。这会使它更具可读性,但这只是一个约定,完全可以接受意见。在这种情况下,您将拥有 app.TodoView 和 app.todoRouter。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多