Fel*_* A. 2 javascript backbone.js marionette
按照快速原型方法,我正在 Marionette.js/backbone.js 中开发一个应用程序,并大量使用窗口对象将集合和视图绑定到全局堆栈(例如 window.app.data、window.app.views) 。
当然,将对象封装在单个类中并在需要时将它们作为参数传递总是更好(更平滑!)。然而,当应用程序及其潜在用例变得非常大时,这就会有一些限制。由于我处理的数据来自 API,因此任何感兴趣的人都可以访问,这是否证明将数据存储在窗口对象中是合理的?或者 ES6(或者特别是 Marionette.js)中是否有其他最佳实践来实现相同的结果,但以更私密的方式?!
我已经在另一个答案中详细介绍了 JavaScript 中的简单命名空间模式。您似乎已经接近这window.app.data一点等。
但看来您对 JavaScript 的工作原理有很多误解。
基于命名空间的解决方案,与 Browserify/AMD 模块完美集成
那为什么不使用RequireJS呢?浏览器化?还是网页包?没有什么是模块化方法不能做得更好的,而全局的意大利面条式代码却能做到这一点。
这样将是只读的
不可以。虽然将对象属性设置为只读并非不可能,但您必须使用类似Object.seal或 之类Object.freeze的内容显式执行此操作。
我不想将对象附加到命名空间,而是将实际实例附加到名称空间
JavaScript 没有“命名空间”作为语言的一部分,它只是一种将所有代码范围限制在文字对象(键值)内的模式。
你可以放任何你想要的东西。
const MyNamespace = {
MyType: Backbone.Model.extend({ /*...*/ }),
instance: new Backbone.Model(),
anyValue: "some important string",
};
Run Code Online (Sandbox Code Playgroud)
理想情况下,您可以在IIFE中定义命名空间,以避免将任何变量泄漏到全局范围。
const app = app || {};
app.MyModel = (function(app){
return Backbone.Model.extend({
// ...
});
})(app);
Run Code Online (Sandbox Code Playgroud)
[...] 我处理的数据来自 API,因此任何感兴趣的人都可以访问
即使数据包含在不会泄漏到全局范围的模块中,任何人都可以访问该数据。JavaScript就是这样工作的,它在用户的浏览器中,他可以对代码和数据做任何他想做的事情。
这是否证明在窗口对象中存储数据是合理的?
不。
或者ES6还有其他最佳实践吗
ES6 与您为应用程序采用的架构和模式无关。
但以更私密的方式?!
正如我之前所说,JavaScript 中的隐私是不可预期的。
当应用程序及其潜在用例变得非常大时,[将对象封装在单个类中并在需要时将它们作为参数传递]有一些限制。
这是不正确的。恰恰相反。软件模式的存在只是为了帮助减轻项目范围扩大时出现的任何限制。
您可以使用多种模式来帮助处理较大应用程序的复杂性,例如:
我没有专门阅读这本书,但《JavaScript 设计模式》似乎是学习更多内容的好方法,它演示了 JS 中软件模式的具体实现。