fishbone

A super lightweight (½kb) JavaScript library with automatic method chaining, automatic context binding, event support and simple inheritance.

Fishbone.js c-{{{-<

A super lightweight (½kb) JavaScript library with automatic method chaining, automatic context binding, event support and simple inheritance.

Version: 1.0.1

  • clean and simple syntax
  • steep learning curve
  • this is the context in all methods
  • automatic method chaining
  • simple inheritance
  • on, off event observer pattern
  • no dependencies
  • production ready
  • well tested
  • cross browser & Node.js support
  • ~ 512 bytes minified (300 gzipped !)
  • Klass = Model({ init: function(options){} }) - create a model
  • Klass2 = Klass.extend({ … }) - inherit from other class
  • instance = new Klass(options) - create an instance
  • instance.on(event, listener) - observe a given event
  • instance.off(event, [listener]) - remove listener
  • instance.trigger(event, data) - triggers an event
var Model = require("./fishbone");              // require module (Node only) 
 
var Pirate = Model({                            // simple class creator 
  likes: "GROG",                                // instance properties 
  initfunction(name){                         // init is the main entrance 
    this.name = name;                           // options can be passed 
    this.grogs = 0;
  },
  drinkfunction(){                            // instance method 
    if (++this.grogs >= 100){
      this.trigger("drunk");                    // trigger an event 
    }
  },
  yellfunction(){
    console.log("WANT MORE: " + this.likes);    // this is always in context 
  }
});
 
var Captain = Pirate.extend({                   // simple inheritance 
  likes: "STRONG GROG"
});
 
var captain = new Captain("Jack"),              // create an instance 
  rounds = 20;
 
captain.on("drunk", captain.yell);              // add event listener 
 
function neverbeingcalled(){                    // pseudo listener 
  console.error("AAR!");
}
 
captain.on("drunk", neverbeingcalled);          // add event listener 
captain.off("drunk", neverbeingcalled);         // remove event listener 
 
while (rounds--){ 
  captain
    .drink()                                    // chaining FTW! 
    .drink()                                    // chaining FTW! 
    .drink()                                    // chaining FTW! 
    .drink()                                    // chaining FTW! 
    .drink();                                   // chaining FTW! 
}

Include fishbone.js or copy and paste this:

Model=function a(b,c,d,e){function f(){var a=this,f={};a.on=function(a,b){(f[a]||
(f[a]=[])).push(b)},a.trigger=function(a,b){for(var c=f[a],d=0;c&&d<c.length;)c
[d++](b)},a.off=function(a,b){for(d=f[a]||[];b&&(c=d.indexOf(b))>-1;)d.splice(c
,1);f[a]=b?d:[]};for(in b)d=b[c],a[c]=typeof d=="function"?function(){return(
d=this.apply(a,arguments))===e?a:d}.bind(d):d;a.init&&a.init.apply(a,arguments)
}return f.extend=function(f){d={};for(in b)d[c]=b[c];for(in f)d[c]=f[c],b[c
]!==e&&(d["__"+c]=b[c]);return a(d)},f},typeof module=="object"&&(module.exports
=Model);                                                              // c-{{{-< 
 

Install via npm:

npm install fishbone

Fishbone runs in all modern browsers and Node.js.

If you want support for Internet Explorer 8 and below, you have to include the .bind and .indexOf polyfills: https://github.com/aemkei/fishbone.js/blob/master/polyfills.js

Developed by Martin Kleppe at Ubilabs.

Released under the WTFPL license.