A super lightweight (½kb) JavaScript library with automatic method chaining, automatic context binding, event support and simple inheritance.
I've made a few modifications to make this class system behave more like a model
- 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 modelKlass2 = Klass.extend({ … })
- inherit from other classinstance = new Klass(options)
- create an instanceinstance.on(event, listener)
- observe a given eventinstance.off(event, [listener])
- remove listenerinstance.trigger(event, data)
- triggers an event
var Model = require("./fishbone"); // require module (Node only)
var Pirate = Model({ // simple class creator
likes: "GROG", // instance properties
init: function(name){ // init is the main entrance
this.name = name; // options can be passed
this.grogs = 0;
},
drink: function(){ // instance method
if (++this.grogs >= 100){
this.trigger("drunk"); // trigger an event
}
},
yell: function(){
console.log("WANT MORE: " + this.likes); // this is always in context
}
});
var Captain = Pirate.extend({ // simple inheritance
likes: "STRONG GROG", // override property
yell: function(){ // override method
console.log("Avast, me hearties!");
this.__yell(); // call super method
}
});
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!
}
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.