JSFiddle - React, Tailwind, and code Playground

by giltig

JavaScript

var o = {x:5};
EventEmitter(o); // usage as mixin 

o.observe(function(name,params){
    console.log(name,params);
});

o.trigger("x",{changed:"x"});

function EventEmitter(obj) {
    if(!obj){
        obj = this; // usage as a constructor
    }
    obj._handlers = {};
    obj._anyHandlers = [];
    obj._alreadyTriggered = {};

    obj.on = function(whatHappened, whatDoWeDoAboutIt) {
        if (obj._handlers[whatHappened] === undefined) {
            obj._handlers[whatHappened] = [];
        }
        obj._handlers[whatHappened].push(whatDoWeDoAboutIt);
    };
    obj.observe = function(func) {
        obj._anyHandlers.push(func);
    };

    obj.triggerOnce = function(whatHappened, withWhatProps) {
        // assuming no bugs with __proto__ - no reason to raise that
        if (whatHappened in obj._alreadyTriggered) {
            return;
        }
        obj._alreadyTriggered[whatHappened] = true;
        return obj.trigger(whatHappened, withWhatProps)
    };
    obj.trigger = function(whatHappened, withWhatProps) {
        for (var j = 0; j < obj._anyHandlers.length; j++) {
            obj._anyHandlers[j](whatHappened, withWhatProps);
        }

        if (obj._handlers[whatHappened] === undefined) {
            return;
        }
        var evHandlers = obj._handlers[whatHappened];
        for (var i = 0; i < evHandlers.length; i++) {
            evHandlers[i](withWhatProps);
        }
    };
}