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.5.4 SR

"SR" is roughly the equivilant of "::" in C++. However, it can only be used on instances. Its useful to accessing functions that are defined as shared public, or shared private, but were overriden by inheriting structures. The use of "SR" should generally be kept to a minimum.

"SR" can not be used to access variables. This is unlike SR for classes. "SR" does not allow the use of null for the structure name, also unlike SR for classes.

"SR", like "O" for example, must never be passed to functions as parameters, or returned from functions as returns. "SR" will cause fatal errors if the structure is not in the instance's structure inheritance map at all, or if misused.

JS (Tree)
crx_registerStructure("ExampleStructure1",
{
   SHARED:
   {
      PUBLIC:
      {
         FUNCTIONS:
         {
            sharedPulicFunction: function(pA)
            {
               return ("ExampleStructure1::sharedPulicFunction with parameter " + pA);
            },
            testFromExampleStructure1: function(pA)
            {
               //   Calling ExampleStructure1::sharedPulicFunction or
               //      ExampleStructure1::sharedPrivateFunction
               //      will not work if an inheriting structure in the instance
               //      overrides the functions, like ExampleStructure3.
               this.sharedPulicFunction(5);
               this.sharedPrivateFunction(6);
               //   Instead we have to use 'SR'
               this.SR("ExampleStructure1", "sharedPulicFunction", 5);
               this.SR("ExampleStructure1", "sharedPrivateFunction", 6);

               //   The following would call
               //      ExampleStructure2::sharedPulicFunction
               this.SR("ExampleStructure2", "sharedPulicFunction", 7);

               //   Printing the result of the above
               console.log("TESTING FROM ExampleStructure1");
               console.log(this.sharedPulicFunction(5));
               console.log(this.sharedPrivateFunction(6));
               console.log(this.SR("ExampleStructure1", "sharedPulicFunction", 5));
               console.log(this.SR("ExampleStructure1", "sharedPrivateFunction", 6));
               console.log(this.SR("ExampleStructure2", "sharedPulicFunction", 7));
            }
         }
      },
      PRIVATE:
      {
         FUNCTIONS:
         {
            sharedPrivateFunction: function(pA)
            {
               return ("ExampleStructure1::sharedPrivateFunction with parameter " + pA);
            }
         }
      }
   }
});
crx_registerStructure("ExampleStructure2",
{
   SHARED:
   {
      PUBLIC:
      {
         FUNCTIONS:
         {
            sharedPulicFunction: function(pA)
            {
               return ("ExampleStructure2::sharedPulicFunction with parameter " + pA);
            }
         }
      },
      PRIVATE:
      {
         FUNCTIONS:
         {
            sharedPrivateFunction: function(pA)
            {
               return ("ExampleStructure2::sharedPrivateFunction with parameter " + pA);
            }
         }
      }
   }
});
crx_registerStructure("ExampleStructure3",
{
   INHERITS: ["ExampleStructure1", "ExampleStructure2"],
   SHARED:
   {
      PUBLIC:
      {
         FUNCTIONS:
         {
            sharedPulicFunction: function(pA)
            {
               return ("ExampleStructure3::sharedPulicFunction with parameter " + pA);
            },
            testFromExampleStructure3: function(pA)
            {
               this.sharedPulicFunction(8);
               this.sharedPrivateFunction(9);

               this.SR("ExampleStructure1", "sharedPulicFunction", 8);
               this.SR("ExampleStructure1", "sharedPrivateFunction", 9);

               this.SR("ExampleStructure2", "sharedPulicFunction", 8);
               this.SR("ExampleStructure2", "sharedPrivateFunction", 9);

               //   Printing the result of the above
               console.log("TESTING FROM ExampleStructure3");
               console.log(this.sharedPulicFunction(8));
               console.log(this.sharedPrivateFunction(9));
               console.log(this.SR("ExampleStructure1", "sharedPulicFunction", 8));
               console.log(this.SR("ExampleStructure1", "sharedPrivateFunction", 9));
               console.log(this.SR("ExampleStructure2", "sharedPulicFunction", 8));
               console.log(this.SR("ExampleStructure2", "sharedPrivateFunction", 9));
            }
         }
      },
      PRIVATE:
      {
         FUNCTIONS:
         {
            sharedPrivateFunction: function(pA)
            {
               return ("ExampleStructure3::sharedPrivateFunction with parameter " + pA);
            }
         }
      }
   }
});

var instance = crx_new("ExampleStructure3");

instance.testFromExampleStructure1();
instance.testFromExampleStructure3();

//SR is also available on the instance
console.log("------------------");
console.log(instance.SR("ExampleStructure2", "sharedPulicFunction", 10));
TESTING FROM ExampleStructure1
ExampleStructure3::sharedPulicFunction with parameter 5
ExampleStructure3::sharedPrivateFunction with parameter 6
ExampleStructure1::sharedPulicFunction with parameter 5
ExampleStructure1::sharedPrivateFunction with parameter 6
ExampleStructure2::sharedPulicFunction with parameter 7
TESTING FROM ExampleStructure3
ExampleStructure3::sharedPulicFunction with parameter 8
ExampleStructure3::sharedPrivateFunction with parameter 9
ExampleStructure1::sharedPulicFunction with parameter 8
ExampleStructure1::sharedPrivateFunction with parameter 9
ExampleStructure2::sharedPulicFunction with parameter 8
ExampleStructure2::sharedPrivateFunction with parameter 9
------------------
ExampleStructure2::sharedPulicFunction with parameter 10
JS (Verbose)
crx_registerStructure("ExampleStructure1",
{
   VERBOSE: 1,
   "shared public function sharedPulicFunction": function(pA)
   {
      return ("ExampleStructure1::sharedPulicFunction with parameter " + pA);
   },
   "shared public function testFromExampleStructure1": function(pA)
   {
      //   Calling ExampleStructure1::sharedPulicFunction or
      //      ExampleStructure1::sharedPrivateFunction
      //      will not work if an inheriting structure in the instance
      //      overrides the functions, like ExampleStructure3.
      this.sharedPulicFunction(5);
      this.sharedPrivateFunction(6);
      //   Instead we have to use 'SR'
      this.SR("ExampleStructure1", "sharedPulicFunction", 5);
      this.SR("ExampleStructure1", "sharedPrivateFunction", 6);

      //   The following would call
      //      ExampleStructure2::sharedPulicFunction
      this.SR("ExampleStructure2", "sharedPulicFunction", 7);

      //   Printing the result of the above
      console.log("TESTING FROM ExampleStructure1");
      console.log(this.sharedPulicFunction(5));
      console.log(this.sharedPrivateFunction(6));
      console.log(this.SR("ExampleStructure1", "sharedPulicFunction", 5));
      console.log(this.SR("ExampleStructure1", "sharedPrivateFunction", 6));
      console.log(this.SR("ExampleStructure2", "sharedPulicFunction", 7));
   },
   "shared private function sharedPrivateFunction": function(pA)
   {
      return ("ExampleStructure1::sharedPrivateFunction with parameter " + pA);
   }
});
crx_registerStructure("ExampleStructure2",
{
   VERBOSE: 1,
   "shared public function sharedPulicFunction": function(pA)
   {
      return ("ExampleStructure2::sharedPulicFunction with parameter " + pA);
   },
   "shared private function sharedPrivateFunction": function(pA)
   {
      return ("ExampleStructure2::sharedPrivateFunction with parameter " + pA);
   }
});
crx_registerStructure("ExampleStructure3",
{
   VERBOSE: 1,
   "inherits": ["ExampleStructure1", "ExampleStructure2"],
   "shared public function sharedPulicFunction": function(pA)
   {
      return ("ExampleStructure3::sharedPulicFunction with parameter " + pA);
   },
   "shared public function testFromExampleStructure3": function(pA)
   {
      this.sharedPulicFunction(8);
      this.sharedPrivateFunction(9);

      this.SR("ExampleStructure1", "sharedPulicFunction", 8);
      this.SR("ExampleStructure1", "sharedPrivateFunction", 9);

      this.SR("ExampleStructure2", "sharedPulicFunction", 8);
      this.SR("ExampleStructure2", "sharedPrivateFunction", 9);

      //   Printing the result of the above
      console.log("TESTING FROM ExampleStructure3");
      console.log(this.sharedPulicFunction(8));
      console.log(this.sharedPrivateFunction(9));
      console.log(this.SR("ExampleStructure1", "sharedPulicFunction", 8));
      console.log(this.SR("ExampleStructure1", "sharedPrivateFunction", 9));
      console.log(this.SR("ExampleStructure2", "sharedPulicFunction", 8));
      console.log(this.SR("ExampleStructure2", "sharedPrivateFunction", 9));
   },
   "shared private function sharedPrivateFunction": function(pA)
   {
      return ("ExampleStructure3::sharedPrivateFunction with parameter " + pA);
   }
});

var instance = crx_new("ExampleStructure3");

instance.testFromExampleStructure1();
instance.testFromExampleStructure3();

//SR is also available on the instance
console.log("------------------");
console.log(instance.SR("ExampleStructure2", "sharedPulicFunction", 10));
TESTING FROM ExampleStructure1
ExampleStructure3::sharedPulicFunction with parameter 5
ExampleStructure3::sharedPrivateFunction with parameter 6
ExampleStructure1::sharedPulicFunction with parameter 5
ExampleStructure1::sharedPrivateFunction with parameter 6
ExampleStructure2::sharedPulicFunction with parameter 7
TESTING FROM ExampleStructure3
ExampleStructure3::sharedPulicFunction with parameter 8
ExampleStructure3::sharedPrivateFunction with parameter 9
ExampleStructure1::sharedPulicFunction with parameter 8
ExampleStructure1::sharedPrivateFunction with parameter 9
ExampleStructure2::sharedPulicFunction with parameter 8
ExampleStructure2::sharedPrivateFunction with parameter 9
------------------
ExampleStructure2::sharedPulicFunction with parameter 10