JavaScript module pattern: How do private methods access module's scope?
Asked Answered
K

2

13

When implementing the module pattern, how do private functions access the private properties of the module? I haven't seen any examples where developers do this. Is there any reason not to?

var module = (function(){
    // private property
    var number = 0;

    // private method
    _privateIncrement = function(){
        // how do I access private properties here?
        number++;
    };

    // public api
    return {
        // OK
        getNumber: function(){
             return number;   
        },
        // OK
        incrNumber: function(){
             number++;  
        },
        // Doesn't work. _privateIncrement doesn't have
        // access to the module's scope.
        privateIncrNumber: function(){
            _privateIncrement();
        }
    };
})();
Kola answered 20/12, 2011 at 18:5 Comment(2)
Works fine: jsfiddle.net/DREKt Although you likely want to precede _privateIncrement with a var declaration.Tribrach
if number wasn't bound in the module's closure, and was a part of the object, then you might need to use apply() or call() to invoke the private method in the correct context. _privateIncrement.call(this)Tennessee
P
13

When implementing the module pattern, how do private functions access the private properties of the module?

The properties are in scope, so they "just do"

Doesn't work.

Yes, it does.

_privateIncrement doesn't have access to the module's scope.

Yes, it does.

See live example of the following:

var module = (function(){
    // private property
    var number = 0;

    // global method
    _privateIncrement = function(){
        number++;
    };

    // public api
    return {
        // OK
        getNumber: function(){
             return number;   
        },
        // OK
        incrNumber: function(){
             number++;  
        },
        // Does work!
        privateIncrNumber: function(){
            _privateIncrement();
        }
    };
})();

// Show default value
document.body.innerHTML += (module.getNumber());
// Increment
module.privateIncrNumber();
// Show new value
document.body.innerHTML += (module.getNumber());
// Increment (since _privateIncrement was defined as a global!)
_privateIncrement();
// Show new value
document.body.innerHTML += (module.getNumber());

// Output: 012
Pagurian answered 20/12, 2011 at 18:11 Comment(2)
+1 although I think OP by saying "how do private functions access the private properties of the module" tries to explain that he/she wants to access properties of the returned object (eg. getNumber() method) from within _privateIncrement() function.Mindoro
Quentin is right. I had a bug elsewhere in my system that was throwing off the private variable. Thank you.Kola
M
3

One alternative to have private methods with access to the this is by using the call or apply methods.

function Restaurant()
{
    this.mongoose = 'beans';
    this.freedom = {bear:'love',a:'12'};

    var myPrivateVar;

    var private_stuff = function()   // Only visible inside Restaurant()
    {
        myPrivateVar = "I can set this here!";
        this.mongoose = 12;
    }

    this.use_restroom = function()   // use_restroom is visible to all
    {
        private_stuff();
    }

    this.buy_food = function()    // buy_food is visible to all
    {
        private_stuff();
    }

    private_stuff.call(this);
}

var bobbys = new Restaurant();

Of course you would move the use_restroom and buy_food to a prototype and private_stuff outside of the constructor if you were planning on having multiple instances of this object.

Michaud answered 29/10, 2013 at 18:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.