JS:关于全球"窗口的最佳实践"宾语

时间:2018-01-07 20:38:23

标签: javascript backbone.js marionette

遵循快速原型方法,我在Marionette.js / backbone.js中开发一个应用程序,并大量使用window-object将集合和视图绑定到全局堆栈(例如window.app.data,window.app .views)。

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

1 个答案:

答案 0 :(得分:3)

我已经在另一个答案中进入details about a simple namespacing pattern in JavaScript了。你好像已经接近window.app.data等。

但看起来你对JavaScript的运作方式有很多误解。

  

基于命名空间的解决方案,与Browserify / AMD模块完美集成

那么为什么不使用RequireJS? Browserify?还是Webpack?全局性的意大利面条代码无法做到模块化方法无法做得更好。

  

这样就是只读

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

  

我不想将对象附加到命名空间,而是实际实例

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

你可以放任何你喜欢的东西。

var MyNamespace = {
  MyType: Backbone.Model.extend({ /*...*/ }),
  instance: new Backbone.Model();
}

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

var app = app || {};

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

[...]我处理的数据来自API,因此任何感兴趣的人都可以访问

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

  

这是否可以证明在window-object中存储数据?

没有

  

或者ES6中还有其他最佳做法

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

  

但是以更私密的方式?!

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

  

[将对象封装在一个类中并在需要时将它们作为参数传递]在应用程序及其潜在用例变得非常大时会有一些限制。

这是不正确的。这是相反的方式。软件模式仅用于帮助减轻项目范围扩大时出现的任何限制。

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

  • 带组件的模块化方法
  • 依赖注入
  • 服务容器
  • 工厂
  • 活动

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