我遇到了这篇文章,虽然接受的答案显示它是一个单例,但我对原始问题的回答是“在 Node.js 中,我是否在“需要”时创建了一个新对象?” 是“取决于”。
murvinlai 的答案/逻辑仍然适用于最新版本的 Node(在撰写本文时为 v0.10.18),但前提是您以这种方式设置了所需的文件。例如,如果您在 User.js 中有以下“用户”代码(结构与 murvinlai 的答案不同),我正在尝试使用更详细的示例来避免任何混淆
/**
* User Model
*/
function modelUser() {
var User = {
/**
* User::_id
*
* @var integer
*/
"_id" : null,
/**
* Set id
*
* @param integer id
* @return User
*/
"setId" : function(id)
{
User._id = id;
return User;
},
/**
* Get id
*
* @return integer
*/
"getId" : function()
{
return User._id;
},
}
return User;
}
exports.modelUser = modelUser;
现在,如果您使用上面的代码,您可能会发现在许多情况下无需修改就不会遇到 Singleton 问题。即:
var user1 = require("./application/models/User.js").modelUser(); // In one module
var user2 = require("./application/models/User.js").modelUser(); // In another module
user1.setId(1);
console.log(user1.getId());
console.log(user2.getId());
你会得到 1,null。此外,我什至不确定你是否需要这个,但你可以在 require 上使用 new 运算符(因为它本质上只是返回一个函数)。即:
var user1 = new require("./application/models/User.js").modelUser(); // In one module
var user2 = new require("./application/models/User.js").modelUser(); // In another module
user1.setId(1);
console.log(user1.getId());
console.log(user2.getId());
你会得到相同的输出。
同样,最初的问题有点宽泛(问题可能最终与猫鼬有关(如 murvinlai 的回应中的#3 中所述),但以上是另一种处理方式以产生实际新对象的示例关闭每个 require()。现在您可能需要在执行此操作之前考虑一下,因为有时您需要 Singleton(例如将缓存值存储在 ORM/Mapper 中),但最后您是否创建了一个新的对象,这取决于..