<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@1.4.3" data-semver="1.4.3" src="https://code.angularjs.org/1.4.3/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-app="myApp">
    <h1>Hello Plunker!</h1>
    <div ng-controller="myCtrl"></div>
  </body>

</html>
// An example on how to privatize members in an AngularJS Factory method, while 
// still having getters and setters on the resultant object's prototype, rather
// than reinstantiating those methods for every instance.

var app = angular.module('myApp', []);

app.factory('objectFactory', function(){
  return function(opts){
    var privObj = {
      val:'default'
    },
    privPrim = false;
    
    function SomeClass(){
      var innerPriv = null;
    }
    
    SomeClass.prototype.setPrivObj = function(newPriv){
      privObj = newPriv;
      return this;
    };
    
    SomeClass.prototype.getPrivObj = function(){
      return privObj;
    };
    
    SomeClass.prototype.getPrivPrim = function(){
      return privPrim;
    };
    
    SomeClass.prototype.setPrivPrim = function(newVal){
      privPrim = newVal;
      return this;
    };
    
    var instance = new SomeClass();
    
    //Object constructor initialization 
    if(opts){
      instance.setPrivObj(opts);
    }
    return instance;
  };
});

app.controller('myCtrl', function(
  objectFactory
){
  var obj1 = objectFactory();
  var obj2 = objectFactory({
    val: 'default2'
  });
  
  console.log(obj1.getPrivObj(), obj2.getPrivObj(), obj1.getPrivPrim(), obj2.getPrivPrim());
  
  obj1.setPrivObj({val: 'one'});
  obj2.setPrivObj({val: 'two'});
  obj1.setPrivPrim('True');
  obj2.setPrivPrim(true);
  
  console.log(obj1.getPrivObj(), obj2.getPrivObj(), obj1.getPrivPrim(), obj2.getPrivPrim());
  
  obj1.setPrivObj({val: 'three'});
  obj2.setPrivObj({val: 'four'});
  obj1.setPrivPrim(false);
  obj2.setPrivPrim('False');
  
  console.log(obj1.getPrivObj(), obj2.getPrivObj(), obj1.getPrivPrim(), obj2.getPrivPrim());
  
});
/* Styles go here */