Search code examples
javascriptoopobjectprivate

Is it possible for all instances of a function to have access to the same private var?


When I do a closure to have private members like in this example by Douglas Crockford

function Container(param) {
  function dec(){
    if (secret > 0) {
      secret -= 1;
      return true;
    } else {
      return false;
    }
  }
  var secret = 3;
  this.service = function(){
    if(dec()){
      return param;
    } else {
      return null;
    }
  };
}

Each instance of Container will have a private secret. What if I wanted all the instances of Container to share access to the same private variable? (there are lots of ways to do this with a public variable of course)

So that a call to any instance of Container would lower secret by 1 and no matter what instance call this.service it could be called only 4 times.


Solution

  • Create the object constructor by using a IIFE and put the secret inside that scope:

    var Container = (function(){
      var secret = 3;
    
      return function(param) {
        function dec(){
          if (secret > 0) {
            secret -= 1;
            return true;
          } else {
            return false;
          }
        }
    
        this.service = function(){
          if(dec()){
            return param;
          } else {
            return null;
          }
        };
      };
    })();