MicroEvent.js is a event emitter library which provides the observer pattern to javascript objects. It works on node.js and browser. It is a single .js file containing a 20 lines class (only 321-bytes after minification+gzip).

/**
 * MicroEvent - to make any js object an event emitter
 *
 * - pure javascript - server compatible, browser compatible
 * - dont rely on the browser doms
 * - super simple - you get it immediatly, no mistery, no magic involved
 *
 * @author Jerome Etienne (https://github.com/jeromeetienne)
 */

var MicroEvent = function() {};

MicroEvent.prototype = {
    on: function(event, fct) {
        this._events = this._events || {};
        this._events[event] = this._events[event] || [];
        this._events[event].push(fct);
    },

    off: function(event, fct) {
        var n = arguments.length;
        if (n === 0) return delete this._events;
        if (n === 1) return delete this._events[event];

        this._events = this._events || {};
        if (event in this._events === false) return;
        this._events[event].splice(this._events[event].indexOf(fct), 1);
    },

    trigger: function(event /* , args... */) {
        this._events = this._events || {};
        if (event in this._events === false) return;
        for (var i = 0; i < this._events[event].length; i++) {
            this._events[event][i].apply(
                this,
                Array.prototype.slice.call(arguments, 1)
            );
        }
    }
};

/**
 * Mixin will delegate all MicroEvent.js function in the destination object.
 *
 * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent
 *
 * @param {object} the object which will support MicroEvent
 */
MicroEvent.mixin = function(destObject) {
    var props = ["on", "off", "trigger"];
    for (var i = 0; i < props.length; i++) {
        destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
    }
};

// ---------------------------------------------------------------------------
// Example Usage
// ---------------------------------------------------------------------------

var Ticker = function(interval) {
    var self = this;
    setInterval(function() {
        self.trigger("tick", new Date());
    }, 500);
};

/**
 * make Ticker support MicroEventjs
 */
MicroEvent.mixin(Ticker);

// create a ticker
var ticker = new Ticker();
// bind the 'tick' event
ticker.on("tick", function(date) {
    // display to check
    console.log("notified data" + date);
});