Created
October 15, 2011 16:25
-
-
Save WebReflection/1289809 to your computer and use it in GitHub Desktop.
Transform any sort of object into Event emitter/dispatcher
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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