javascript - JS : Best practice on global "window" object

标签 javascript backbone.js marionette

按照快速原型(prototype)方法,我正在 Marionette.js/backbone.js 中开发一个应用程序,并大量使用窗口对象将集合和 View 绑定(bind)到全局堆栈(例如 window.app.data、window.app .views)。

当然,将对象封装在单个类中并在需要时将它们作为参数传递总是更好(更平滑!)。然而,当应用程序及其潜在用例变得非常大时,这就会有一些限制。由于我处理的数据来自 API,因此任何感兴趣的人都可以访问,这是否证明将数据存储在窗口对象中是合理的?或者 ES6(或者特别是 Marionette.js)中是否有其他最佳实践来实现相同的结果,但以更私密的方式?!

最佳答案

我已经进入details about a simple namespacing pattern in JavaScript在另一个答案中。您似乎已经通过 window.app.data 等接近了这一点。

但看来您对 JavaScript 的工作原理有很多误解。

a namespace-based solution that integrates nicely with Browserify/AMD-modules

那为什么不使用RequireJS呢?浏览器化?还是网页包?没有什么是模块化方法不能做得更好的,而全局的意大利面条式代码却能做到这一点。

such would be read-only

没有。虽然将对象属性设置为只读并非不可能,但您必须明确使用类似 Object.seal or Object.freeze 的内容来执行此操作。 .

I do not want to attach objects to the namespace, but actual instances

JavaScript 没有“命名空间”作为语言的一部分,它只是一种将所有代码范围限制在文字对象(键值)内的模式。

你可以放任何你想要的东西。

const MyNamespace = {
  MyType: Backbone.Model.extend({ /*...*/ }),
  instance: new Backbone.Model(),
  anyValue: "some important string",
};

理想情况下,您可以在 IIFE 中定义命名空间以避免将任何变量泄漏到全局范围。

const app = app || {};

app.MyModel = (function(app){
  return Backbone.Model.extend({
    // ...
  });
})(app);

[...] data I deal with comes from an API and therefore would be anyway accessible to anybody interested

即使数据包含在不会泄漏到全局范围的模块中,任何人都可以访问该数据。 JavaScript 就是这样工作的,它在用户的浏览器中,他可以对代码和数据做任何他想做的事。

does that justify storing data in the window-object?

没有。

Or are there other best-practices in ES6

ES6 与您为应用程序采用的架构和模式无关。

but in a more private manner?!

正如我之前所说,JavaScript 中的隐私是不可预期的。

[encapsulate objects in a single class and pass them as parameters where needed] has some limitations when an app and its potential use-cases become really big.

这是不正确的。恰恰相反。软件模式的存在只是为了帮助减轻项目范围扩大时出现的任何限制。

您可以使用多种模式来帮助处理较大应用程序的复杂性,例如:

  • 采用组件的模块化方法
  • 依赖注入(inject)
  • 服务容器
  • 工厂
  • 事件
  • 等等

我没有专门读这本书,但是JavaScript Design Patterns似乎是了解更多信息的好方法,它演示了 JS 中软件模式的具体实现。

关于javascript - JS : Best practice on global "window" object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48141299/

相关文章:

javascript - 更改集合内的 div 类

javascript - 如何用任何东西替换 Backbone.sync,甚至没有 localStorage?

javascript - 响应中嵌套对象的 Backbone model.set

javascript - 为什么我们需要 backbone js 或任何 JS MVC 框架?

javascript - CompositeView 不呈现 ItemView,甚至不触发 appendHtml

javascript - 如何从 Marionette Collectionview 中删除类名

typescript 注释

javascript - jQuery - 如何根据子项的属性选择父项?

javascript - YouTube 嵌入 WordPress - 高度问题

javascript - SpiderMonkey 变量列表