この投稿に出くわしました。受け入れられた回答はシングルトンであることを示していますが、元の質問「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;
上記のコードを使用した場合、多くの場合、変更を加えなくてもシングルトンの問題が発生しないことがわかります。IEと:
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演算子を使用できます(基本的には関数を返すだけなので)。IEと:
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()をオフにします。シングルトン(たとえば、キャッシュされた値をORM / Mapperに格納する)が必要になる場合があるため、これを行う前に検討することをお勧めしますが、最後に新しいものを作成しますオブジェクト、それは依存します。