Building up function by function

by uedatakuya

JavaScript

function argumentsToArray(argObj) {
    var args = [];
    Object.keys(argObj).forEach(function(i){
            args.push(argObj[i]);
    });
    
    return args;
}

function expandable(fnc) {
    
    if (typeof fnc !== "function") {
        fnc = function(){};
    }
        
    var that = function() {
        var args = argumentsToArray(arguments);
        fnc.apply(that, args);
    };
    
    that.expand = function(newFunc) {
        var f = fnc;
        fnc = function() {
            var args = argumentsToArray(arguments);

            f.apply(that, args);
            newFunc.apply(that, args);
        };
        
        return that;
    };
    
    return that;
}

var foo1 = expandable(function(x) {
    console.log(x);
});
foo1(1);

foo1.expand(function(x) {
    console.log(x+1);
});
foo1(1);

foo1.expand(function(x) {
    console.log(x+2);
});
foo1(1);