JSFiddle - React, Tailwind, and code Playground

JavaScript

//Foo entrance
function Foo(bar){
    //construct a new Foo object to return
    return new Foo.prototype.build(bar);
}

//constructor for returning new prototype
Foo.prototype.build = function(bar){
    //initialize base settings
    this.bar = bar;
    //chain object
    return this;
};

//this is complex part
//tie the prototype of Foo.prototype.build.prototype to Foo.prototype
//so that is "seems" like Foo is the parent of the prototype assignments
//while allowing for the use of returning a new object in the Foo entrance
Foo.prototype.build.prototype = Foo.prototype;

//simple expansions at this point, nothing looks too different
//makes a function for a constructed Foo that logs hello
Foo.prototype.hello = function(){
    console.log("Hello "+this.bar+" :)");
    //returns this for chaining
    return this;
};

//more extensions, this one changes this.bar's value
Foo.prototype.setBar = function(arg){
    //accesses the current Foo instance's .bar property
    this.bar = arg;
    //returns this for chianing
    return this;
};

//should be seeing a pattern
Foo.prototype.goodbye = function(){
    console.log("Bye "+this.bar+" :(");
    return this;
};

var foo = Foo(42);
//console.log(bar); // ERROR
console.log(foo.bar); // 42
foo.hello(); //Hello 42 :)
foo.hello().setBar(9001).goodbye(); //Hello 42 :) Bye 9001 :(