遵循快速原型方法,我在Marionette.js / backbone.js中开发一个应用程序,并大量使用window-object将集合和视图绑定到全局堆栈(例如window.app.data,window.app .views)。
当然,将对象封装在单个类中并将其作为参数传递给需要的东西总是更好(更顺畅!)。但是,当应用程序及其潜在用例变得非常大时,这有一些限制。由于我处理的数据来自API,因此任何感兴趣的人都可以访问,这是否有理由将数据存储在window-object中?或者是否有其他最佳实践在ES6(或特别是Marionette.js)中实现相同的结果,但是以更私密的方式?!
答案 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中软件模式的具体实现。