javascript - 在 Window 对象上设置属性是否被认为是不好的做法?

标签 javascript architecture

我正在编写一个非常复杂的 JavaScript 应用程序,它具有我正在使用 Prototype 的 Class 实现的 MVC 架构支持和模块模式。该应用程序使用 AJAX 和观察者模式。我在 DOM 加载后创建我的 Controller 实例,将 View 和一些从 JSON 数据创建的模型传递给它,然后它就消失了。

但是,我发现我必须将我的 Controller 实例设置为 Window 对象的属性——即在不使用 var 的情况下声明它——因为我有一个 AJAX 成功回调来刷新 Controller 拥有的 View 对象,此时在代码中我漂亮的小 MVC 世界不在范围内。

我研究了将 View 对象作为参数传递给包含 AJAX 代码的函数,但这变得非常困惑,并且会导致对 MVC 模式的一些可怕的违反,例如耦合模型和 View 。太可怕了。

将我的 Controller 实例直接存储在 Window 上的行为是否被认为是错误的形式?对我来说,这有点像使用全局变量,但我看不出有任何解决方法。

最佳答案

在窗口对象上设置属性等同于创建全局变量。也就是说,有时这样做是不可避免的,但您应该尽量将其保持在最低限度,因为它最终会污染全局命名空间。

在您的情况下,创建单个属性并不是那么糟糕。如果您想格外小心,您可以为需要全局访问的任何内容显式创建一个命名空间:

// In init:
var mynamespace = {};

. . .

// Once the controller is available:
var namespace = window.mynamespace;
namespace.controller = controller;
namespace.foo = bar; // Set other stuff here as well.

关于javascript - 在 Window 对象上设置属性是否被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3679634/

相关文章:

javascript - java脚本中的非模态警报消息,由按钮激活

javascript - Puppeteer 在指定时间安排 Action

javascript - 表格的浏览器内 HTML 编辑器?

javascript - Angular js 中的数据绑定(bind)

oop - 插件系统背后的逻辑?

database-design - 数据仓库 RedShift 与其他 RDBM

javascript - Backbone.js 仅适用于单页应用程序吗?

c# - 如果您被迫使用 Anemic 域模型,您将业务逻辑和计算字段放在哪里?

php - 多站点系统的数据库结构 - 数据库和 PHP

javascript - 是否可以为一个测试设置环境变量?