我有点熟悉require.js
和Backbone.js
已经将它们一起使用了大约一年而且相对较新Backbone.Marionette
尽管我对它能带来什么感兴趣
在寻找项目结构的例子时(我可以对这些东西有点痴迷)我找到了https://github.com/BoilerplateMVC/Marionette-Require-Boilerplate和其他类似的例子。
困扰我的事情:在他们的app.js
文件中,他们返回对Marionette应用程序的实例的引用,即:
var app = new Backbone.Marionette.Application();
app.addInitializer(...);
...
return app;
在许多组件中,他们通过app.js
引用require.js
并使用如下:
define([..., 'app'], function (... , App) {
App.someProperty(...);
});
现在这就是我不理解的地方:我一直假设他们app.js
中的代码更像是 Factory 而不是 Class 因为它返回应用程序的实例,而不是修改原型或其扩展名。
因此,当他们引用app.js
时,他们是不是实际创建了一个全新的实例而不是访问某种共享实例?没有任何迹象表明 app.js 在他们的代码中返回单例。
然而,它有效,显然我是那个困惑的人。
那么,为什么这有用呢?
答案 0 :(得分:3)
这是有效的,因为对象在javascript中通过引用传递,而且require.js只加载一次依赖项。然后,app.js
返回一个初始化的实例,而需要'app'
的每个其他模块都会引用同一个对象。
它不是工厂,它只是一个初始化的应用程序对象实例。