backbone.js JS:关于全局“window”对象的最佳实践

bmp9r5qi  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(161)

按照快速原型化方法,我在Marionette.js/backbone.js中开发了一个应用程序,并大量使用window-object将集合和视图绑定到全局堆栈(例如window.app.data、window.app.views)。
当然,总是更好(更流畅!)将对象封装在单个类中,并在需要时将其作为参数传递。然而,当应用程序及其潜在用例变得非常大时,这会有一些限制。而且由于我处理的数据来自API,因此任何感兴趣的人都可以访问这些数据。这是否证明在窗口对象中存储数据是正确的?或者在ES6(或者特别是Marionette.js)中是否有其他最佳实践可以实现相同的结果,但以更私密的方式?!

wtzytmuj

wtzytmuj1#

我已经在另一个答案中进入了details about a simple namespacing pattern in JavaScript。你似乎已经接近了window.app.data等。
但看起来您对JavaScript的工作原理有很多误解。
一个基于命名空间的解决方案,它与Browserify/AMD模块完美集成
那么,为什么不使用RequireJS、Browserify或Webpack呢?模块化方法可以做得更好,而全局化的意大利面代码却做得更好。
这将是只读
不可以。虽然将对象属性设置为只读并非不可能,但必须使用Object.seal or Object.freeze之类的对象显式地进行设置。
我不想将对象附加到命名空间,但要将实际示例
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);

[...]我处理的数据来自API,因此任何感兴趣的人都可以访问
即使数据包含在一个模块中,不会泄漏到全局范围,任何人都可以访问数据,这就是JavaScript的工作原理,它在用户的浏览器中,用户可以对代码和数据做任何他想做的事情。
这是否证明将数据存储在window-object中是正确的呢?
不,不,不
或者,ES6中是否有其他最佳做法
ES6与您为应用程序采用的架构和模式无关。
但要更私密一点!
正如我前面所说的,JavaScript中的隐私是不可能的。
[将对象封装在单个类中,并在需要时将其作为参数传递]在应用及其潜在用例变得非常大时会有一些限制。
这是不正确的。相反,软件模式的存在只是为了帮助缓解随着项目范围的扩大而出现的任何限制。
您可以使用多种模式来帮助处理大型应用程序的复杂性,例如:

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

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

相关问题