JSFiddle - React, Tailwind, and code Playground

by parksd

JavaScript

(function () {
    var monitorTool,
        car,
        wrapperFunction;
    monitorTool = (function () {
        var functionSequence = [];
        return {
            decorate: function (name, func) {
                functionSequence.push({
                    name: name,
                    func: func });
            },
            monitor: function (func) {
                var length = functionSequence.length;
                for (i = 0 ; i < length ; i++) {
                    functionSequence[i].func.apply(this, arguments);
                }
            }
        };
    }());
    monitorTool.decorate("before", function (func) {
        console.log(func.name + " function has started at " + Date.now());
    });
    monitorTool.decorate("decorated", function (func) {
        func.apply(this, Array.prototype.slice(arguments, 1));
    });
    monitorTool.decorate("after", function (func) {
        console.log(func.name + " function has finished at " + Date.now());
    });
    wrapperFunction = monitorTool.monitor;
    car = {
        beep: function beep() {
            alert("BEEP"); },
        brake: function brake() {
            alert("STOP!");
        },
        accelerator: function accelerator() {
            alert("GO");
        }
    };
    function wrap(func, wrapper) {
        return function() {
            var args = [func].concat(Array.prototype.slice.call(arguments));
            return wrapper.apply(this, args);
        };
    }
    function wrapObject(obj, wrapper) {
        var prop;
        for(prop in obj) {
            if (obj.hasOwnProperty(prop) && typeof obj[prop] === "function") {
                obj[prop] = wrap(obj[prop], wrapper);
            }
        }
    }
    wrapObject(car, wrapperFunction);
    console.log("A. car.accelerator() monitor");
    car.accelerator();
    console.log("\nB. car.beep() monitor");
    car.beep();
    console.log("\nC. car.brake() monitor");
    car.brake();
}());