Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:关于全局“窗口”对象的最佳实践_Javascript_Backbone.js_Marionette - Fatal编程技术网

Javascript JS:关于全局“窗口”对象的最佳实践

Javascript JS:关于全局“窗口”对象的最佳实践,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,按照快速原型方法,我正在木偶网/backbone.js中开发一个应用程序,并大量使用window对象将集合和视图绑定到全局堆栈,例如window.app.data、window.app.views 当然,它总是更平滑!将对象封装在单个类中,并在需要时将其作为参数传递。然而,当一个应用程序及其潜在用例变得非常庞大时,这有一些限制。由于我处理的数据来自API,因此任何感兴趣的人都可以访问,这是否证明将数据存储在window对象中是合理的?或者ES6或特别是Marionette.js中是否有其他最佳实

按照快速原型方法,我正在木偶网/backbone.js中开发一个应用程序,并大量使用window对象将集合和视图绑定到全局堆栈,例如window.app.data、window.app.views

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

我已经在另一个答案中进行了讨论。您似乎已经通过window.app.data等接近这一点

但是看起来你对JavaScript的工作原理有很多误解

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

那么为什么不使用RequireJS呢?Browserify?还是网页包?一个全球化的意大利面代码所能做的一切,都是模块化方法无法做得更好的

这将是只读的

不可以。虽然将对象属性设置为只读并非不可能,但必须使用类似的方法显式执行

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

JavaScript没有名称空间作为语言的一部分,它只是一种模式,用于在文本对象键值中定义所有代码的范围

你想放什么就放什么

const MyNamespace = {
  MyType: Backbone.Model.extend({ /*...*/ }),
  instance: new Backbone.Model(),
  anyValue: "some important string",
};
理想情况下,您应该在中定义名称空间,以避免将任何变量泄漏到全局范围

const app = app || {};

app.MyModel = (function(app){
  return Backbone.Model.extend({
    // ...
  });
})(app);
[…]我处理的数据来自API,因此任何感兴趣的人都可以访问

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

这是否证明将数据存储在窗口对象中是合理的

没有

或者ES6中还有其他最佳实践吗

ES6与应用程序的架构和模式无关

但是以更私密的方式

正如我前面所说的,JavaScript中的隐私是不可预料的

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

那是不对的。反过来说。软件模式的存在仅仅是为了帮助缓解随着项目范围的扩大而出现的任何限制

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

带组件的模块化方法 依赖注入 服务容器 工厂 事件 等
我没有专门阅读这本书,但这似乎是一个了解更多信息的好方法,它展示了JS中软件模式的具体实现。

避免污染全局窗口对象的一种方法是创建一个,我还没有找到一个基于名称空间的解决方案,可以很好地与Browserify/AMD模块集成,比如只读模块,不是吗?!。另外,我不想将对象附加到名称空间,而是实际的实例,这样我就可以读取和写入已经获取的数据。