gpt4 book ai didi

javascript - 使用 require.js,避免重复更新对象

转载 作者:行者123 更新时间:2023-12-02 17:50:53 24 4
gpt4 key购买 nike

如果不使用 Require.js 之类的东西,当应用程序加载到用户的 Web 浏览器中时,我会实例化应用程序客户端 Controller 之类的东西。这样,在浏览器中应用程序的生命周期内,内存中将保留每个 Controller 的单个实例。

引入 Require.js 后,实现相同目标的惯用方法是什么?

最佳答案

我建议导出 AMD 模块中的类,而不是实例。例如

// controllers/some_controller.js
define(function (require) {
function SomeController() {};
SomeController.prototype.foo = function () {};
return SomeController;
});

然后在其他地方管理对象的生命周期,也许在你的 app.js 中你可以做类似的事情

// app.js
define(function (require) {

var SomeController = require("./controllers/some_controller");

var activeController;

...

router.on("/foo", function () {
if (activeController) {
activeController.destroy();
}
activeController = new SomeController();
});
});

或者,如果你想让 Controller 成为单例,就像你说的,你可以这样做

// app.js
define(function (require) {

var controllers = {
"some": require("./controllers/some_controller")
};
var controllerCache;

function getController(name) {
if (!controllerCache[name]) {
controllerCache[name] = new controllers[name]();
}
return controllerCache[name];
}

var activeController;

...

router.on("/foo", function () {
if (activeController) {
activeController.exit();
}
activeController = getController("some");
});
});
无论如何,这些都是相当复杂的示例,但我的主要观点是,我建议在模块中导出类(而不是实例),这样您就可以控制如何管理这些对象及其生命周期,这也有助于可测试性,因为你可以要求该类, stub 它,提供模拟依赖项等。(有关使用容器查找各种对象实例的更高级示例,请查看 http://www.slideshare.net/mixonic/containers-di 。他甚至给出了如何将其与 AMD 模块一起使用的示例)

希望这会有所帮助。

更新当然,您也可以导出函数或具有函数的对象以及其他任何合适的内容,但很可能您不想在模块的顶层实例化事物或执行事物 - 最好将其作为应用程序流程的一部分,而不是作为引入模块流的 require.js 的一部分..

关于javascript - 使用 require.js,避免重复更新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21365528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com