JavaScript Observerのサンプル

function Observer() {
  this.listeners = {};
}

Observer.prototype = {
  on: function(event, func) {
    if(!this.listeners[event]) {
      this.listeners[event] = [];
    }
    this.listeners[event].push(func);
  },
  off: function(event, func) {
    var ref = this.listeners[event];
    for (var i = 0, il = ref.length; i < il; i++) {
      if(ref[i] === func) {
        ref.splice(i, 1);
      }
    }
  },
  trigger: function(event) {
    var ref = this.listeners[event];
    for (var i = 0, il = ref.length; i < il; i++) {
      if(typeof ref[i] === 'function') {
        ref[i]();
      }
    }
  }
};
var observer = new Observer();
var r = document.getElementById('result');
var ohayou = function() {
  r.innerHTML += 'ohayou<br>';
};
var konbanwa = function() {
  r.innerHTML += 'konbanwa<br>';
};
var oyasumi = function() {
  r.innerHTML += 'oyasumi<br>';
};
observer.on('night', konbanwa);
observer.on('morning', ohayou);
observer.on('night', oyasumi);
observer.trigger('morning');
observer.trigger('night');