问题标签 [module-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
5590 浏览

javascript - Javascript 模块模式和新关键字

我了解了模块模式的基础知识以及它使用闭包来允许私有成员,但我不能完全理解为什么下面的代码会这样做:

控制台输出是

因此,这里故意省略了new关键字,第一次调用设置myCalc为 Calculator 对象。它从priv值 0 开始,递增,然后打印出它的新priv值 1。

但是a)为什么下一个调用Calculator()最终返回对SAME对象的引用(如第二个'1'所示)?我知道我可以new在这里使用并避免这种情况,但不明白为什么我必须这样做。这个函数不是使用对象字面量语法来本质上创建一个新对象然后返回它吗?b) 既然它似乎确实使用了相同的函数堆栈空间(在 JS 中这是正确的思考方式吗?),为什么priv在返回对同一对象的引用之前不将进程中的变量清零?

编辑:更正了草率/愚蠢的错误(感谢 scessor),即使不使用new关键字,它现在也会输出一个新的/不同的计算器对象。这样就清除了a)和b)。我产生的问题将是“在调用模块模式构造函数时是否使用是否重要new。答案是,我想这并不重要(?)。(约瑟夫:见http://jsfiddle。 net/MvMvy/5/ ... instanceof 运算符根本不适用于模块模式。)

0 投票
2 回答
3606 浏览

javascript - 如何扩展使用 AMD 定义的 Javascript 模块?

首先是历史,我们有一个引擎,它由许多本质上是模块的 javascript 文件组成。这些模块返回一个分配给全局范围的单个类,尽管在指定的命名空间下。

引擎本身用于显示 eLearning 内容,每个不同的 eLearning 课程需要略有不同的需求,这是我们根据必要的功能将 javascript 文件包含到页面中的地方。(只有一个入口页面)。

我一直在权衡是否值得更改为 AMD、require.js 和 r.js,或者是否最好继续使用我们当前的系统,该系统包含页面上所需的所有内容并将其最小化到一个脚本中。

我去 AMD 的最大问题之一是,似乎很难轻松地扩展一个类。例如,有时我们必须稍微调整原始类的行为。因此,我们在页面上添加另一个脚本包含,通过复制原始原型来扩展原始类,执行被 apply 覆盖的原始函数,然后执行所需的任何附加代码。

您可以在不修改原始文件的情况下扩展 AMD 模块吗?还是我错过了重点,我们最好坚持目前正在做的事情?

0 投票
3 回答
8182 浏览

javascript - javascript模块模式变量范围

我正在学习 javascript 和模块模式,但我在代码中犯了一个错误,事实证明,我认为关于这种模式的一些概念是错误的。我的基本代码是这样的:

然后当我的页面加载并调用代码时:

它按顺序给出警报:

正如我所料。但是,如果我将内容组件更改为这样:

它按顺序发出警报:

所以我看到它能够访问窗帘变量,即使它没有作为参数传递到模块中。我认为每个模块都是自包含的,但我发现事实并非如此,是否有办法让一个模块也只能访问你想要的变量?特别是对我的例子会有帮助,谢谢丹。

0 投票
3 回答
361 浏览

javascript - 为什么在javascript中实现模块模式时要自我执行

我只是想知道为什么在 javascript 中实现模块模式时需要自我执行代码。

以下代码是典型的模块模式示例:

但是,我无法找出为什么这个函数应该用右花括号自行执行的原因。

0 投票
1 回答
476 浏览

javascript - jQuery AJAX 跨模块通信(模块模式)

我最近重构了我的 javascript/jquery 应用程序代码以使用模块模式。

我有两个模块,比如说 A 和 B。

模块 B 包含一个公共方法(例如,Bmethod),它进行 jQuery AJAX JSONP 调用($.ajax)并在回调中传递响应。

在模块 A 中有一个对 B.Bmethod() 的调用,其中包含一个回调函数来处理返回的响应。

这是模块B的定义:

现在,这是模块 A 的定义以及模块 B 上的方法调用

这是我加载模块 A 并开始执行代码的方式:

这里的问题是,我在 Chrome 和 Firefox 上有不同的行为。在 Chrome 上,根本没有执行 AJAX 调用。没有发送请求。但是,在 Firefox 上,我可以看到发出的请求并得到响应,但我没有收到成功回调。

如果我将所有这些代码放在模块之外,只放在一个文件中,一切似乎都可以正常工作。

我已经看到很多人(也在 StackOverflow 上)成功使用模块模式和 AJAX 调用,但无法弄清楚我做错了什么。

有什么想法/解决方案吗?

0 投票
1 回答
528 浏览

javascript - 如何使用模块模式在 javascript 中扩展事件委托?

我在 JavaScript 中使用模块模式。我有一个文件说 controller.js 处理事件。问题是我想使用子模块。但是由于事件是在 controller.js 中处理的,如果出现任何事件,我将如何处理子模块中的事件?
我调度了一个PAGE_DISPLAYED从另一个文件中调用的自定义事件,比如 view.js。此事件由 controller.js 侦听,并根据显示的页面执行其他操作,例如绑定特定于该特定页面的附加事件处理程序。如何使用子模块做到这一点。

示例代码:

如何扩展上述代码和事件委托?或者代码架构是否存在任何限制。

我正在使用 jQuery Mobile 并PAGE_DISPLAYED通过监听事件来调度pagechange事件:

谢谢。

0 投票
1 回答
110 浏览

javascript - MVVM UI 集成心智块

我一直在“尝试”创建一个良好的可靠框架来在 html 空间中构建企业应用程序(转换为 silverlight 应用程序)。

我喜欢 MVVM 模式的想法,这让我在 javascript 世界中感觉更加自在。我的思维障碍是将所有基于 UI 的逻辑锁定到 ViewModel 中。大部分应用程序将被拆分为许多“单页应用程序”,这些应用程序只是列出 -> 详细信息(而不是重复)。

当涉及到执行客户端 DOM 操作(例如隐藏、显示元素、动画等)或客户端路由(sammyjs 到客户端在列表和详细信息之间导航)时,我不知道应该把它放在哪里。这一切都应该在视图模型中吗?在视图模型的单独脚本中拥有一半的逻辑是否正确。

我看到了很多 MVVM 的例子,所有的 javascript 逻辑都完全在 viewmodel 中,但是这些例子都很简单。

我正在使用 KendoUI 的 MVVM 实现。

当我失去理智时,请有人给我一些指导。

谢谢

0 投票
5 回答
24897 浏览

javascript - 如何在实际示例中使用 javascript 模块模式?

我正在尝试了解 JavaScript 模块模式。我已经看过它应该是什么样子的例子,但我不明白如何使用它。

例如,这里发生了一些事情:

我怎样才能使用上面的例子:

我在哪里添加点击事件,声明我的变量,addMessage使用 ajax 调用添加函数。并调用addMessage函数?我必须把所有东西都包起来$(document).ready(function()吗?

任何人都可以为我阐明这一点吗?

谢谢

0 投票
2 回答
5986 浏览

javascript - 如何将 window.setTimeout 与 javascript 和模块模式一起使用

我有这个例子:

谁能解释我如何让这段代码inputClick()每 3 秒调用一次该方法?

谢谢

0 投票
1 回答
1715 浏览

javascript - 在 JAVASCRIPT 模块模式中定义私有字段成员和继承

我可以使用下面的代码在模块模式中定义私有成员字段

这个方法工作得很好,但是这个问题的问题是,每当我创建一个新对象时,所有函数的副本都会被创建并加载到内存中(不像 java,其中同一类的所有对象共享相同的函数内存)

我尝试使用以下其他方法:

但是这种方法的问题是显然 obj1,obj2 共享相同的私有字段副本(因此它们实际上是静态的)。那么有没有办法在模块模式中定义私有字段,同时为对象使用相同的函数副本?

对于上述第一种方法的继承,我首先需要在子类中创建一个对象,然后返回该对象。

但这实际上只是将 baseClass 的对象包装在 childClass 中,是否有其他方法可以实现相同的方法(对于第一种或第二种方法),以便它可以像真正的 java 继承一样使用受保护的、私有的等方法?