sjsclass

sjsClass - Simple JavaScript Class - Inheritance

sjsClass

Simple JavaScript Class. Create your advanced JavaScript Class!

var Class = require('sjsclass');

require('sjsclass').registerGlobal();

examples/nodejs-test-*.js
  • https://github.com/reduardo7/sjsClass/blob/master/examples/nodejs-test-global.js
  • https://github.com/reduardo7/sjsClass/blob/master/examples/nodejs-test-normal.js

Using extend method:

  • Class.extend(string ClassName, object definition);
  • Class.extend(string ClassName);
  • var ClassName2 = Class.extend(string ClassName, object definition);
  • var ClassName2 = Class.extend(string ClassName);
  • var ClassName = Class.extend(object definition);

Using Class function:

  • Class(string ClassName, object definition);
  • Class(string ClassName);
  • var ClassName2 = Class(string ClassName, object definition);
  • var ClassName2 = Class(string ClassName);
  • var ClassName = Class(object definition);
    Person.extend('newClassName', {
        __constructorfunction() {
            this.var = 1; // -> Public only for this class. 
        }
    });
    var newClassName = Person.extend({
        ...
    });

    Class.extend('Person', {
        __static: {
            // Static methods 
            testStaticfunction() {
                return true;
            },
            staticVar: true,
            count: 100
        },
        'static getCount'function() {
            return this.count;
        },
        'static getVar'function() {
            return this.staticVar;
        }
        ...
    });
    alert(Person.testStatic());
    alert(Person.staticVar);
    alert(Person.count);
    alert(Person.getCount());
    alert(Person.getVar());

    // Web Page 
    (function(context) {
        ...
    })(window);
    Class.extend('Person', ...
    var p = new Person(...
    var contextName = {};
    (function(context) {
        ...
    })(contextName);
    contextName.Class.extend('Person', ...
    var p = new contextName.Person(...

    Class.extend('Person', {
        __static: {
            count: 100
        },
        __constructfunction() {
            this.__static.count++;
        }
    });

  • Class Class.newInstance([object ConstructorParams])
  • Class Class.newInstanceOf(string ClassName, [object ConstructorParams])
    Class.extend('Person', {
        __constructfunction(var1var2varN) {
            ...
        }
    });
    var p1 = new Person(22, 13, 16);
    var p2 = Person.newInstance(22, 13, 16);
    var p3 = Class.newInstanceOf('Person', 22, 13, 16);
    // p1 == p2 == p3 

    Person.extend('Ninja', {
        __static: {
            testStaticfunction() {
                this.super(); // Call parent 'testStatic' 
            }
        },
        __constructorfunction() {
            this.__super(true); // Call parent constructor 
            ...
        },
        dancefunction() {
            this.__super(4); // Call parent method 
            ...
        }
    });

    Person.extend('Ninja', {
        __static: {
            testStaticfunction() {
                this.super(); // Call parent 'testStatic' 
            }
        },
        dancefunction() {
            this.__parent.testStatic();
            ...
        }
    });

  • Boolean classInstance.hasMethod(string MethodName)
  • Boolean classInstance.hasVar(string VarName)
    Person.extend('Ninja', {
        methodNamefunction() {
            ...
        },
        varName: 123
    });
    var p = new Person();
    if (p.hasMethod('methodName')) alert('Yes');
    if (p.hasVar('varName')) alert('Yes');

  • String classInstance.getClassName()
  • String Class.getClassName()
    Person.extend('Ninja', {
        ...
    });
    var p = new Person();
    alert(p.getClassName()); // -> Alert 'Person' 
    var n = new Ninja();
    alert(n.getClassName()); // -> Alert 'Ninja' 
    var Other = Person.extend({
        ...
    });
    var o = new Other();
    alert(o.getClassName()); // -> Alert 'Person_extended_0' 
    var Foo = Person.extend({
        ...
    });
    var f = new Foo();
    alert(f.getClassName()); // -> Alert 'Person_extended_1' 
    var Bar = Ninja.extend('Fighter', {
        ...
    });
    var b = new Bar();
    alert(b.getClassName()); // -> Alert 'Fighter' 

  • String classInstance.hashCode()
    var p1 = new Person(false);
    console.log(p1.hashCode()); // -> Get instence Hash Code 

  • Boolean classInstance.equals(Class ClassInstance)

Check's instances Hash Codes and Class Names.

    var p1 = new Person(false);
    var p2 = Person.newInstance(false);
    console.log(p1.equals(p2)); // -> true 

  • String classInstance.toString()
    var p1 = new Person(false);
    console.log(p1.toString()); // -> String representation 

    Class.extend('Ninja', {
        __onExtendfunction() {
            alert('Extending Ninja class!');
        }
    });
    Ninja.extend('Fighter', {
        ...
    });
    var f = new Fighter(); // -> Alert 'Extending Ninja class!' 

  • Boolean Class.classExists(string ClassName)
    Class.extend('Ninja', {
        ...
    });
    Class.classExists('Ninja') && !Class.classExists('Dog'); // -> TRUE 

    // Creates a 'FightFighter' class, not a 'Fighter' class. 
    Class.extend('Fighter', {
        __prefix: 'Fight',
        ...
    });
    // Creates a 'FightSamuray' class, not a 'Samuray' class. 
    FightFighter.extend('Samuray' {
        ...
    });
    // Creates a 'Ninja' class, not a 'FightNinja' class. 
    FightFighter.extend('Ninja' {
        __prefix: null,
        ...
    });
    // Override 'FightSamuray' class. 
    Class.extend('FightSamuray' {
        ...
    });

  • Class Class.getClass(string ClassName);
    Class.extend('Person', {
        ...
    });
    var p = Class.getClass('Person');
    // p === Person 

    Class.extend('Person', {
        __const : {
            BROTHER : 'Mateo',
            FLIA : 'Cuomo'
        },
        'const SISTER' : 'Luciana'
    });
    var f = new Person;
    f.BROTHER = 'Eduardo';
    f.SISTER = 'Vanesa';
    f.BROTHER; // ->  'Mateo' 
    f.SISTER; // -> 'Luciana' 

    Class.extend('Foo', {
        __protected : {
            privV : 123,
            privF : function () {
                return this.privV + this.priv3;
            }
        },
        'protected priv3' : 'Protected Value',
        setX : function (x) {
            this.privV = x;
        },
        test : function () { return this.privF(); }
    });
    var f = new Foo;
    f.setX(456);
    f.test(); // -> 'Protected Value456' 
    f.privF(); // -> Error 
    f.privV; // ->  
    f.priv3; // ->  

  • Object __properties
  • Object property
  • Object prop

Link: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    Class.extend('Fighter', {
        __property : {
            Val : {
                get : function () { return this.val; },
                set : function (value) { this.val = value; }
            }
        },
        'prop foo' : {
            get : function () { return this.val * 3; }
        },
        'property bar' : {
            value : 123,
            enumerable : false,
            writable : true
        },
        'protected val' : null
    });
 
    var f = new Fighter();
    f.Val = 21;
    f.Val; // -> 21 
    f.foo = 123;
    f.foo; // -> 63 
    f.bar; // -> 63 

  • Boolean __fluent

If __fluent is TRUE, then the methods that return , this instance will return.

    Class.extend('Foo', {
        __fluent : true, // Enable Fluent Interface 
        __static : {
            x : '',
            add : function (x) { this.x += x; }, // Fluent Interface 
            bar : function () { return this.x; }
        },
        'protected x' : '',
        add : function (x) { this.x += x; }, // Fluent Interface 
        bar : function () { return this.x; }
    });
    var f = new Foo();
    f.add(10).add(13).add('LM');
    Foo.add(88).add(86).add('VE');
    console.log(
        f.bar(), // -> 1013LM 
        Foo.bar() // ->8886VE 
    );

  • String classInstance.__instanceId()

Get Instance ID.

    Class.extend('Foo', {
        ...
    });
 
    console.log(
        Foo.__classId
    );

  • String classInstance.__instanceId()

Get Instance ID.

    Class.extend('Foo', {
        ...
    });
 
    var f1 = new Foo();
    var f2 = new Foo();
 
    console.log(
        f1.__instanceId,
        f2.__instanceId
    );

  • String ClassName.__instanceCount()

Get created objects count.

    Class.extend('Foo', {
        ...
    });
 
    console.log(Foo.__instanceCount); // -> 0 
    Foo.__instanceCount = 111;
    console.log(Foo.__instanceCount); // -> 0 
 
    var f1 = new Foo();
    var f2 = new Foo();
    console.log(Foo.__instanceCount); // -> 2 

  • Object classInstance.__package
    var foo = { };
 
    Class.extend('Cls', {
        __package : foo,
        ...
    });
 
    var c = new foo.Cls();
    var com = {
        eduardocuomo = {
            examples = { }
        }
    };
 
    Class.extend('Test', {
        __package : com.eduardocuomo.examples,
        ...
    });
 
    var t = new com.eduardocuomo.examples.Test();

  • Class.package(packageObject, packagerFunction(packageObject))
    // package 
    var com = {
        eduardocuomo : {
            demo : { }
        }
    };
 
    Class.package(com.eduardocuomo.demo, function () {
 
        Class.extend('Foo');
 
    });
 
    com.eduardocuomo.demo.Foo.package(function () {
 
        Class('Bar');
 
    });
 
    Class.package(com.eduardocuomo.demo, function ($) {
 
        var f = new $.Foo(),
            b = new this.Bar();
 
    });

  • Class.Exception(message, innerException)
    Class.Exception.extend('FooException');
 
    // Anonymous Exception 
    var BarException = FooException.extend();
 
    // New Exception 
    Class.Exception.extend('TestException', {
        'protected _data' : ,
        'property data' : { get : function () { return this._data; } },
        __constructor : function (messagedatainnerException) {
            this.__super(message, innerException);
            this._data = data;
        }
    });
 
    // Result 
    var result = true;
 
    // Test 
 
    try {
        try {
            throw new FooException();
        } catch (e1) {
            e1.data = 'NO SET';
            e1.message = 'NO SET';
 
            // Should all be true 
            result = result && (e1 instanceof Class.Exception) && (e1 instanceof FooException) &&
                (e1.message === );
 
            throw new BarException('Bar Message', e1);
        }
    } catch (e2) {
        // Should all be true 
        result = result && (e2 instanceof Class.Exception) && (e2 instanceof FooException) && (e2 instanceof BarException) &&
            !!e2.innerException && (e2.innerException instanceof FooException) && !(e2.innerException instanceof BarException) &&
            (e2.message === 'Bar Message') && !e2.hasVar('data');
    }
 
    try {
        throw new TestException('Test Message', { v1 : true, v2 : 'Test' });
    } catch (e3) {
        // Should all be true 
        result = result && (e3 instanceof Class.Exception) && !(e3 instanceof FooException) && !(e3 instanceof BarException) &&
            e3.data && (e3.message === 'Test Message') && (e3.data.v1 === true) && (e3.data.v2 === 'Test');
    }
 
    // Should all be true 
    result

  • Object classInstance.__function
    Class('Test', {
        __function : function (v) {
            return '[[' + v + '|' + v + ']]';
        }
    });
 
    // Should all be true 
    Test(123) === '[[123|123]]'

  • Boolean classInstance.__preventOverride
    Class('Test');
 
    // Override Test Class 
    Class('Test', {
        __preventOverride : true
    });
 
    // Error, can't override! 
    Class('Test', { ... });

  • classInstance classInstance.defineProperty(String PropertyName, object PropertyDefinition)

About JavaScript Property: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    Class.extend('DynProp', {
        __constructorfunction (pnamepvalue) {
            this.defineProperty(pname, {
                value: pvalue
            });
        }
    });
 
    var dyn = new DynProp('testProp', 'testValue');
 
    // Should all be true 
    (dyn.testProp === 'testValue')