Where the OOP part of CrxOop is an implementation of a pre existing paradigm, Structures are this author's vision, formalation, and generalization of prototypal inheritance and how it would work if javascript was a non scripting for rapid development, non strict, language like C++ or Java. In other words, structure are CrxOop's implementation of Prototype Based Programming, or as this author likes to call it, Prototype Object Based Programming (POBP).
Traditionaly, using plain javascript, different programmers resulted to different methods to implementing various features, such as private access, when coding prototype based data types. Each method had its own shortcoming, and non were complete. CrxOop introduces well defined fully functional implementation of POBP as this author envisions it. It should be noted that CrxOop's implementation is a super set of what traditionaly programmers envision when they apply their favorite method to code prototype based data types and the various effects that they want. CrxOop calls the prototype based data types, Structures.
The following is a list of the high level features implemented in CrxOop for POPB, and an explanation for each.
CrxOop's POBP facility offers two syntaxes for defining Structures, and one syntax for everything else. The following illustration should cover quickly most of the features supported, apart from iteration.
crx_registerStructure('structureA',
{
PUBLIC:
{
CONSTRUCT: function()
{
console.log('CONSTRUCTING A');
}
},
PRIVATE:
{
VARS:
{
privateVar: "structureA::privateVar"
},
FUNCTIONS:
{
privateFunction: function()
{
return "structureA::privateFunction()";
}
}
},
SHARED:
{
PUBLIC:
{
VARS:
{
sharedPublicVar1: "structureA::sharedPublicVar1"
},
FUNCTIONS:
{
sharedPublicFunction1: function(pA)
{
console.log("I am structureA::sharedPublicFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
}
}
},
PRIVATE:
{
VARS:
{
sharedPrivateVar1: "structureA::sharedPrivateVar1"
},
FUNCTIONS:
{
sharedPrivateFunction1: function(pA)
{
console.log("I am structureA::sharedPrivateFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
},
sharedPrivateFunction2: function(pA)
{
console.log("I am structureA::sharedPrivateFunction2() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
}
}
}
}
});
crx_registerStructure('structureB',
{
PUBLIC:
{
CONSTRUCT: function()
{
console.log('CONSTRUCTING B');
}
},
PRIVATE:
{
VARS:
{
privateVar: "structureB::privateVar"
},
FUNCTIONS:
{
privateFunction: function()
{
return "structureB::privateFunction()";
}
}
},
SHARED:
{
PUBLIC:
{
VARS:
{
sharedPublicVar2: "structureB::sharedPublicVar2"
},
FUNCTIONS:
{
test2: function(pStructureB_Or_C_Or_D)
{
console.log("I am structureB::test2() and I can see the private shared " +
"variable, that I defined, in another instance. The value is " +
this.O(pStructureB_Or_C_Or_D).sharedPrivateVar1);
console.log("---------");
}
}
},
PRIVATE:
{
VARS:
{
sharedPrivateVar1: "structureB::sharedPrivateVar1"
},
FUNCTIONS:
{
sharedPrivateFunction2: function(pA)
{
console.log("I am structureB::sharedPrivateFunction2() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
}
}
}
}
});
crx_registerStructure('structureC',
{
INHERITS: ['structureB'],
PUBLIC:
{
CONSTRUCT: function(pA)
{
console.log('CONSTRUCTING C: Passed ' + pA);
}
},
PRIVATE:
{
VARS:
{
privateVar: "structureC::privateVar"
},
FUNCTIONS:
{
privateFunction: function()
{
return "structureC::privateFunction()";
}
}
},
SHARED:
{
PUBLIC:
{
VARS:
{
sharedPublicVar1: "structureC::sharedPublicVar1"
}
},
PRIVATE:
{
VARS:
{
sharedPrivateVar1: "structureC::sharedPrivateVar1"
}
}
}
});
crx_registerStructure('structureD',
{
INHERITS: ['structureA', 'structureC'],
PUBLIC:
{
CONSTRUCT: function(pA)
{
this.CONSTRUCT('structureC')(pA);
console.log('CONSTRUCTING D');
}
},
PRIVATE:
{
VARS:
{
privateVar: "structureD::privateVar"
},
FUNCTIONS:
{
privateFunction: function()
{
return "structureD::privateFunction()";
}
}
},
SHARED:
{
PUBLIC:
{
FUNCTIONS:
{
sharedPublicFunction1: function(pA)
{
console.log("I am structureD::sharedPublicFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
},
test: function()
{
this.sharedPrivateFunction1(21);
this.sharedPrivateFunction2(24);
this.SR("structureA", "sharedPrivateFunction1", 28);
}
}
},
PRIVATE:
{
VARS:
{
sharedPrivateVar1: "structureD::sharedPrivateVar1"
},
FUNCTIONS:
{
sharedPrivateFunction1: function(pA)
{
console.log("I am structureD::sharedPrivateFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
}
}
}
}
});
var a = crx_new("structureD", 123);
a.sharedPublicFunction1(10);
a.SR("structureA", "sharedPublicFunction1", 11);
a.test();
a.test2(crx_new("structureC", 99));
crx_registerStructure('structureA',
{
VERBOSE: 1,
"public CONSTRUCT": function()
{
console.log('CONSTRUCTING A');
},
"private var privateVar": "structureA::privateVar",
"private function privateFunction": function()
{
return "structureA::privateFunction()";
},
"shared public var sharedPublicVar1": "structureA::sharedPublicVar1",
"shared public function sharedPublicFunction1": function(pA)
{
console.log("I am structureA::sharedPublicFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
},
"shared private var sharedPrivateVar1": "structureA::sharedPrivateVar1",
"shared private function sharedPrivateFunction1": function(pA)
{
console.log("I am structureA::sharedPrivateFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
},
"shared private function sharedPrivateFunction2": function(pA)
{
console.log("I am structureA::sharedPrivateFunction2() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
}
});
crx_registerStructure('structureB',
{
VERBOSE: 1,
"public CONSTRUCT": function()
{
console.log('CONSTRUCTING B');
},
"private var privateVar": "structureB::privateVar",
"private function privateFunction": function()
{
return "structureB::privateFunction()";
},
"shared public var sharedPublicVar2": "structureB::sharedPublicVar2",
"shared public function test2": function(pStructureB_Or_C_Or_D)
{
console.log("I am structureB::test2() and I can see the private shared " +
"variable, that I defined, in another instance. The value is " +
this.O(pStructureB_Or_C_Or_D).sharedPrivateVar1);
console.log("---------");
},
"shared private var sharedPrivateVar1": "structureB::sharedPrivateVar1",
"shared private function sharedPrivateFunction2": function(pA)
{
console.log("I am structureB::sharedPrivateFunction2() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
}
});
crx_registerStructure('structureC',
{
VERBOSE: 1,
INHERITS: ['structureB'],
"public CONSTRUCT": function(pA)
{
console.log('CONSTRUCTING C: Passed ' + pA);
},
"private var privateVar": "structureC::privateVar",
"private function privateFunction": function()
{
return "structureC::privateFunction()";
},
"shared public var sharedPublicVar1": "structureC::sharedPublicVar1",
"shared private var sharedPrivateVar1": "structureC::sharedPrivateVar1"
});
crx_registerStructure('structureD',
{
VERBOSE: 1,
INHERITS: ['structureA', 'structureC'],
"public CONSTRUCT": function(pA)
{
this.CONSTRUCT('structureC')(pA);
console.log('CONSTRUCTING D');
},
"private var privateVar": "structureD::privateVar",
"private function privateFunction": function()
{
return "structureD::privateFunction()";
},
"shared public function sharedPublicFunction1": function(pA)
{
console.log("I am structureD::sharedPublicFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
},
"shared public function test": function()
{
this.sharedPrivateFunction1(21);
this.sharedPrivateFunction2(24);
this.SR("structureA", "sharedPrivateFunction1", 28);
},
"shared private var sharedPrivateVar1": "structureD::sharedPrivateVar1",
"shared private function sharedPrivateFunction1": function(pA)
{
console.log("I am structureD::sharedPrivateFunction1() and I " +
"recieved parameter " + pA + " and I see " +
this.privateVar + " and " + this.privateFunction() + " and " +
this.sharedPublicVar1 + " and " + this.sharedPublicVar2 + " and " +
this.sharedPrivateVar1);
console.log("---------");
}
});
var a = crx_new("structureD", 123);
a.sharedPublicFunction1(10);
a.SR("structureA", "sharedPublicFunction1", 11);
a.test();
a.test2(crx_new("structureC", 99));
Look at Figure 2, the Tree Syntax tab. There are Few things to note:
Look at Figure 2, the Verbose Syntax tab. There are Few things to note:
Refer back to Figure 2. CrxOop provides a number of 'keywords' to provide its functionality, most of which appear in the JS code in the figure. The 'keywords' fall under three types:
The following is the list of these keywords: O, THIS, CONSTRUCT, SR, and HASOWN.
The following is the list of these keywords: crx_registerStructure, and crx_new.
Keep in mind that all keywords, and typing functions which will be discussed later and are provided by CrxOop, can lead to fatal errors if used incorrectly. In other words, treat them all as actual keywords, the same way you do with native keywords in C++ and other languages. In other languages a misused keyword will either mean compilation failure, or runtime halt if the language is interpreted.