Giter Site home page Giter Site logo

jassino's Introduction

Alt text

Light, fast, small and well tested OOP in Javascript.

Features

  • Backed by native Javascript prototypes,
  • Most of definitions are processed at class-creation-time,
  • Light wrappers around some constructors
  • Single inheritance from base class
  • Simple and handy Mixins
  • Compact shortcuts for constructors
  • Any level of inheritance allowed (up to your stack size :), calls to super class constructor/methods work well
  • Compatible with usual prototype-bases pseudo classes - you may inherit Jassino class from mere function

Compatibility

  • Object.create() is used
  • Google Apps Script

At a glance

    Jassino.setDefaultNS(window);

    //Namespace. It may contain members as well
    var Bees = {};
    
    //---------------------------------------------------------------
    Mixin('Movable', {        
        total_distance: 0,
        location: {x:0, y:0},  //var members also possible in mixins, 
        move_to: function(loc){
            var t = this;
            t.total_distance = t.total_distance + Math.sqrt( Math.pow(loc.x - t.location.x, 2) 
                + Math.pow(loc.y - t.location.y, 2) );
            t.location = loc
        }
    });

    Mixin(Bees, 'Flyable', [Movable], {     //explicit namespace
        flight_hours: 0,
        fly_to: function(loc){ 
            this.move_to(loc);
            this.flight_hours = this.total_distance * 0.001 // hours per meter
        }
    });

    Mixin('Workable', {   
        work_on: function(place){return "Working on " + place.toString()}
    });

    //---------------------------------------------------------------
    Class('Bee', {             
        _: 'name, lifespan',
        cls: {
            WINGS: {
                oscillating: 1
            }
        }
    });

    Class(Bees, 'FemaleBee', Bee, {
        _: function(_sup, name){         //Explicit constructor
            _sup.call(this,'F');          //super constructor call
            this.name=name;
        }  //constructor
    });

    Class(Bees, 'MaleBee', Bee, [Bees.Flyable], {
        _: 'name, lifespan',
        __: 2
    });

    Class(Bees, 'Queen', Bees.FemaleBee, {               
        _: function(_sup, name){         //Full form of constructor
            _sup.call(this, 'F');          //super constructor call
            this.name=name;
            this.wingType = _sup.WINGS.oscillating;
        }  //constructor
    });
    
    Class(Bees, 'Worker', Bees.FemaleBee, [Workable, Bees.Flyable], {
        //Sort Constructor form, means: 
        // On declaration time, generate constructor accepting 2 parameters,
        // first parameter pass to super constructor
        // second parameter write to this.name 
        _: 'gender, name',
        __:1,
        get_productiveness: function(){ return this.productiveness }
    });
    //----------------------------------------------------------------------------------------------
    var Places = {};

    function Place(visitors_capacity){                //native prototype-based class         
        this.visitors_capacity = visitors_capacity
        this.visitors = []
    }
    Place.prototype.add_visitor = function(vis){
        if (this.visitors.length < this.visitors_capacity){
            this.visitors_capacity.push(vis);
            return true
        }else{
            return false
        }
    };
    Place.prototype.remove_visitor = function(vis){
        if (this.visitors.length < this.visitors_capacity){
            this.visitors_capacity.push(vis);
            return true
        }else{
            return false
        }
    };

    Class(Places, 'Plant', Place, {
        $: 'Place'  //inheriting from native pseudo class requires its explicit name
    });

    Class(Places, 'Flower', Places.Plant, {
        nectar: 5,
        full_amount: 5,
        restore_point: -5,
        get_nectar: function(){ 
            var t = this;
            if (t.nectar < t.restore_point){
                t.nectar = t.full_amount
            }
            this.nectar > 0 ? (this.nectar--, 1) : 0 }
    });


    Class(Places, 'Weed', Places.Plant, {
        nectar: 0,
        get_nectar: function(){ this.nectar ? (this.nectar--, 1) : 0 }
    });

    //----------------------------------------------------------------------------------------------
    Class('BeeKeeper', [Workable], {
        
    });

    //---------------------------------------------------------------

    Class(Places, 'Hive', Place, [Movable], {
        //Constructor shortcut (SuperClass-less form)
        //means: take first argument from constructor and place it into this.bees
        _: 'visitors_capacity, bees',
        __: 1,

        get_most_productive: function(){
            if ( ! this.bees) return null;s
            var most = bees[0];
            for (var bee in this.bees){
                if (bee.get_productiveness() > most.get_productiveness())
                    most = bee;
            }
            return most
        }
    });

    //***************************************************************************
    var hive = new Places.Hive(20, //20 visitors max
                      [new Bees.Queen('')])
    //hive.get_most_productive().gather(place)
    
    var queen = new Bees.Queen('Victoria');
    

Installation

Browser

Include jassino.min.js into your javascript bundle/project.

Google Apps Script

Install as library, docs here

Documentation

TODO, for now see Detailed capabilities of the library may be seen from unit-test examples

Build

./build.sh

CHANGELOG

  • 2.0.1 - minor cleanup
  • 2.0.0 - class members syntax changed,
  • there are 2 hierachies: instances and class member objects
  • constructor accepts now the class, not superclass,
  • and more
  • 1.0.0 WIP, many changes
  • 0.10.2 - improvements in decorators, multiple decorators, cached decorator, more tests
  • 0.10.0 - breaking changes for class members
  • 0.9.0 - full rewrite - breaking changes
  • v0.5.0 - breaking changes, shortcut constructor changes for super case:
    'super_a, super_b, ... ## c, d,...', jassino is now compatible with CoffeeScript 'super' call for ancestor methods, and super constructor in case of explicit declaration of constructor in derived class Error reporting on parameters improved.
  • v0.4 - breaking changes, shortcut constructors ['par1', 'par2', ...] -> 'par1, par2,...', for super constructor [['a', 'b',...]['c', 'd',...]] - > ['a, b, ...', 'c, d,...']
  • v0.3 - first stable version

jassino's People

Contributors

jiem avatar

Stargazers

Denys Volokhovskyi avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.