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.
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"));
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"));
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.