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

6.2 crxOop.instanceOf

crxOop.instanceOf complements the native 'instanceof'. CrxOop, as mentioned earlier, implements class public inheritance. An instance of ClassC that extends ClassB is also an instance of ClassB, and if ClassB extends ClassA, that instance of ClassC is also an instance of ClassA, and so forth. If ClassA implemented InterfaceA, then the instance of ClassC would also be in 'instance' of InterfaceA, however non castable to InterfaceA.

JS (Tree)
crx_registerInterface("ExampleInterface1",
{
});
crx_registerClass("ExampleClass1",
{
   IMPLEMENTS: ["ExampleInterface1"]
});

crx_registerClass("ExampleClass2",
{
   EXTENDS: "ExampleClass1"
});

crx_registerInterface("ExampleInterface3",
{
});
crx_registerClass("ExampleClass3",
{
   IMPLEMENTS: ["ExampleInterface3"],
   EXTENDS: "ExampleClass2"
});
vInstance1 = crx_new("ExampleClass1");
vInstance2 = crx_new("ExampleClass2");
vInstance3 = crx_new("ExampleClass3");

console.log((crxOop.instanceOf(vInstance1, "ExampleClass2") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance2, "ExampleClass1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleClass1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleClass2") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleClass3") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3.CAST("ExampleClass1"), "ExampleClass3") ? "true" : "false"));
console.log("-----------------------------------");
console.log((crxOop.instanceOf(vInstance1, "ExampleInterface1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance2, "ExampleInterface1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleInterface1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleInterface3") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3.CAST("ExampleClass1"), "ExampleInterface3") ? "true" : "false"));
false
true
true
true
true
false
-----------------------------------
true
true
true
true
false
JS (Verbose)
crx_registerInterface("ExampleInterface1",
{
});
crx_registerClass("ExampleClass1",
{
   "VERBOSE": 1,
   "implements": ["ExampleInterface1"]
});

crx_registerClass("ExampleClass2",
{
   "VERBOSE": 1,
   "extends": "ExampleClass1"
});

crx_registerInterface("ExampleInterface3",
{
});
crx_registerClass("ExampleClass3",
{
   "VERBOSE": 1,
   "implements": ["ExampleInterface3"],
   "extends": "ExampleClass2"
});
vInstance1 = crx_new("ExampleClass1");
vInstance2 = crx_new("ExampleClass2");
vInstance3 = crx_new("ExampleClass3");

console.log((crxOop.instanceOf(vInstance1, "ExampleClass2") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance2, "ExampleClass1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleClass1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleClass2") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleClass3") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3.CAST("ExampleClass1"), "ExampleClass3") ? "true" : "false"));
console.log("-----------------------------------");
console.log((crxOop.instanceOf(vInstance1, "ExampleInterface1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance2, "ExampleInterface1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleInterface1") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3, "ExampleInterface3") ? "true" : "false"));
console.log((crxOop.instanceOf(vInstance3.CAST("ExampleClass1"), "ExampleInterface3") ? "true" : "false"));
false
true
true
true
true
false
-----------------------------------
true
true
true
true
false

Notice how when vInstance3, an instance of ExampleClass3, was casted to ExampleClass1, it was no longer an instance of ExampleClass3 nor the interface that ExampleClass3 implements.

crxOop.instanceOf can also be used as plain instanceof, however this only works when both parameters are of type $CRX__native, see crxOop.typeOf, and the second parameter is not a string.