In Node.js, am I creating a new object when “Require”?

后端 未结 2 1740
隐瞒了意图╮
隐瞒了意图╮ 2020-12-24 14:11

So, what I\'m not sure is that. if in ModuleA, I have:

var mongoose = require(\'mongoose\');
mongoose.connect(pathA);

And

2条回答
  •  礼貌的吻别
    2020-12-24 14:35

    I came across this post, and while the accepted answer shows it is a Singleton, my response to the original question "In Node.js, am I creating a new object when “Require”?" is "it depends".

    murvinlai 's answer/logic still holds true through the latest versions of Node ( v0.10.18 as of this writing ), but that's if you have your required file setup that way. For instance, and I'm trying to use a more verbose example to avoid any confusion, if you had the following "User" code in User.js ( structured different than murvinlai 's answer )

    /**
     * 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;
    

    Now if you took the above code, you may find that in many cases with no modification you would not have the Singleton issue. IE with:

    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());
    

    You would get 1, null. Additionally, and I'm not even sure you would need this, but you could use the new operator on the require ( since it's essentially just returning a function ). IE with:

    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());
    

    And you would get the same output.

    Again, the original question was a bit broad ( ant the issues may have ultimately been with mongoose ( as mentioned in #3 of murvinlai 's response ), but the above is an example of another way of doing things to yield an actual new object off each of the require()'s. Now you may want to think before doing this as there are times where you will want the Singleton ( say to store cached values in a ORM/Mapper ), but in closing are you creating a new object, it depends..

提交回复
热议问题