Search code examples
javascriptencapsulation

How to define a javascript internal method that needs to be accessible from inside obj and out


I'm trying to fully grasp JavaScript inheritance and encapsulation. Take the following example (and here is a fiddle of it):

myPage = {
    someObj: function() {
        var x = 0;        

        //PRIVATE: increment by 10
        var inc10 = function() {
            x = x+10;
        };

        //PUBLIC: increment
        this.inc = function() {
            x = x+1;
        };

        //PUBLIC: decrement
        this.dec = function() {
            x = x-1;
        };

        //PUBLIC: output the current value of x
        this.getValue = function() {
            return x;
        }

        inc10(); //as soon as obj1 is created lets add 10
        this.inc(); //as soon as obj1 is created lets add 1 more
    }
};

obj1 = new myPage.someObj(); //x starts out at 11
// obj1.inc10(); won't work because it's private, excellent
obj1.dec();
obj1.inc();

alert(obj1.getValue());

My question is about the inc() method. I need it to be callable from inside and outside of the object. Is this the proper way to do that?


Solution

  • I need it to be callable from inside and outside of the object. Is this the proper way to do that?

    Your script does seem to work as expected already, you are calling the method as this.inc() in your constructor perfectly fine - not sure why it needs improvement.

    You could however define it as a local function, which you then are going to export as a method - and have it still available "inside" as a local variable:

    function SomeObj() {
        // local declarations:
        var x;
        function inc10() {
            x = x+10;
        }
        function inc1() {
            x = x+1;
        }
    
        // exported as property:
        this.inc = inc1; // <== the function from above, not a literal
        this.dec = function() {
            x = x-1;
        };
        this.getValue = function() {
            return x;
        };
    
        // initialisation:
        x = 0;
        inc10();
        inc1(); // this.inc() would still work
    }