Skip to content

Instantly share code, notes, and snippets.

@WebReflection
Created October 15, 2011 16:25
Show Gist options
  • Save WebReflection/1289809 to your computer and use it in GitHub Desktop.
Save WebReflection/1289809 to your computer and use it in GitHub Desktop.
Transform any sort of object into Event emitter/dispatcher
(function () {
// Andrea Giammarchi - Mit Style License
// note: it's not production ready
function dispatch(callback) {
callback.call(this.r, this.e);
}
function add(callback) {
this.handlers.indexOf(callback) < 0 &&
this.handlers.push(callback);
}
function remove(callback) {
var i = this.handlers.indexOf(callback);
-1 < i && this.handlers.splice(i, 1);
}
function createListener(self, listeners, name) {
function listener(evt) {
handlers.forEach(dispatch, {r: self, e: evt});
}
var handlers = [];
listener.handlers = handlers;
listener.add = add;
listener.remove = remove;
listener.fire = listener; // redundant
return listeners[name] = listener;
}
function Event(self, listeners) {
return Proxy.create({
delete: function (receiver, name) {
delete listeners[name];
},
get: function (receiver, name) {
return listeners.hasOwnProperty(name) ?
listeners[name] :
createListener(self, listeners, name)
;
}
});
}
var event = "event";
Object.defineProperty(Object.prototype, "on", {
enumerable: false,
configurable: false,
get: function () {
return this[event] || Object.defineProperty(
this, event, {
enumerable: false,
configurable: false,
writable: false,
value: Event(this, {})
}
)[event];
}
});
}());
/* example
// generic clalback
function click(e) {
alert(e.type);
}
// generic object
var object = {};
// magic "on"
object.on.click.add(click); // add
object.on.click({type: "click"}); // fire
object.on.click.remove(click); // remove
object.on.click({type: "click"}); // nothing
delete object.on.click;
//*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment