Edit in JSFiddle

var Events = Events || {};
(function () {
    'use strict';
    Events = {
        // Bind an event to a `callback` function.
        on: function (name, callback, context) {
            // events={}, events[name]=[]
            //this._events || (this._events = {});
            this._events = this._events || {};
            var events = this._events[name] || (this._events[name] = []);
            //debugger();
            events.push({
                callback: callback,
                context: context,
                ctx: context || this
            });
            return this;
        },
        bind: function (name, callback, context) {
            return this.on(name, callback, context);
        },
        trigger: function (name) {
            if (!this._events) return this;
            var args = [].slice.call(arguments, 1);
            var events = this._events[name];
            var i = -1,
                l = events.length,
                ev = null;
            while (++i < l)(ev = events[i]).callback.apply(ev.ctx, args);
            return this;
        }
    };

}());
var User = Object.create(Events);
User.bind("create", function (foo, bar) {
    console.log(foo, bar);
});
User.trigger("create", "some", "data");

User.on('change:name', function () {
    console.log(arguments);
});
User.trigger('change:name', 'testing1', 'testing2', {
    more: 'test'
}, [1, 2, 3], function () {
    console.log('call me');
}());