CrxOop CrxOop: Bringing Object Oriented Programming, and Proper Prototype Based Programming, To Javascript
The aim of the library documented below is to provide developers with a solution to allow development using interfaces and classes as they are known in other object oriented programming (OOP) languages such as C++, C#, Java and PHP. Further more, V1.4 introduces structures, a generalization of the concept of prototypal inheritance, known here as POBP.
Subject
Body*
Email
SUBMIT CLOSE
Menu

5.4.4 Private Instance Variables and Functions

Private structure members are equivilant to private class members.

Example: Private Access Members
JS (Tree)
crx_registerStructure("ExampleStructureA",
{
   PRIVATE:
   {
      VARS:
      {
         "privateVar": "I am ExampleStructureA::privateVar",
         "privateVar2": "I am ExampleStructureA::privateVar2"
      },
      FUNCTIONS:
      {
         "privateFunction": function()
         {
            return "I am ExampleStructureA::privateFunction()";
         }
      }
   },
   SHARED:
   {
      PUBLIC:
      {
         FUNCTIONS:
         {
            "testFromExampleStructureA": function()
            {
               console.log(this.privateVar);
               console.log(this.privateFunction());
               console.log(this.privateVar2);
            }
         }
      }
   }
});
crx_registerStructure("ExampleStructureB",
{
   INHERITS: ["ExampleStructureA"],
   PRIVATE:
   {
      VARS:
      {
         "privateVar": "I am ExampleStructureB::privateVar",
      },
      FUNCTIONS:
      {
         "privateFunction": function()
         {
            return "I am ExampleStructureB::privateFunction()";
         }
      }
   },
   SHARED:
   {
      PUBLIC:
      {
         FUNCTIONS:
         {
            "testFromExampleStructureB": function()
            {
               console.log(this.privateVar);
               console.log(this.privateFunction());
               console.log(this.privateVar2);
            }
         }
      }
   }
});

var a = crx_new("ExampleStructureB");

console.log("From out side the instance functions");
console.log(a.privateVar);
console.log(a.privateFunction);
console.log("From inside ExampleStructureA function in an ExampleStructureB instance");
a.testFromExampleStructureA();
console.log("From inside ExampleStructureB function in an ExampleStructureB instance");
a.testFromExampleStructureB();
From out side the instance functions
undefined
undefined
From inside ExampleStructureA function in an ExampleStructureB instance
I am ExampleStructureA::privateVar
I am ExampleStructureA::privateFunction()
I am ExampleStructureA::privateVar2
From inside ExampleStructureB function in an ExampleStructureB instance
I am ExampleStructureB::privateVar
I am ExampleStructureB::privateFunction()
undefined
JS (Verbose)
crx_registerStructure("ExampleStructureA",
{
   VERBOSE: 1,
   "private var privateVar": "I am ExampleStructureA::privateVar",
   "private var privateVar2": "I am ExampleStructureA::privateVar2",
   "private function privateFunction": function()
   {
      return "I am ExampleStructureA::privateFunction()";
   },
   "shared public function testFromExampleStructureA": function()
   {
      console.log(this.privateVar);
      console.log(this.privateFunction());
      console.log(this.privateVar2);
   }
});
crx_registerStructure("ExampleStructureB",
{
   VERBOSE: 1,
   INHERITS: ["ExampleStructureA"],
   "private var privateVar": "I am ExampleStructureB::privateVar",
   "private function privateFunction": function()
   {
      return "I am ExampleStructureB::privateFunction()";
   },
   "shared public function testFromExampleStructureB": function()
   {
      console.log(this.privateVar);
      console.log(this.privateFunction());
      console.log(this.privateVar2);
   }
});

var a = crx_new("ExampleStructureB");

console.log("From out side the instance functions");
console.log(a.privateVar);
console.log(a.privateFunction);
console.log("From inside ExampleStructureA function in an ExampleStructureB instance");
a.testFromExampleStructureA();
console.log("From inside ExampleStructureB function in an ExampleStructureB instance");
a.testFromExampleStructureB();
From out side the instance functions
undefined
undefined
From inside ExampleStructureA function in an ExampleStructureB instance
I am ExampleStructureA::privateVar
I am ExampleStructureA::privateFunction()
I am ExampleStructureA::privateVar2
From inside ExampleStructureB function in an ExampleStructureB instance
I am ExampleStructureB::privateVar
I am ExampleStructureB::privateFunction()
undefined

Private variables are the most expensive memory wise, but perhaps they are still cheaper overall than making use of var and closures the way traditionaly this is done. Further more, this privacy is not bound to the instance itself only, which is what you would expect from private access. A behavior that can not be mimicked using the traditional techniques only. Refer to 'O'.