JSFiddle - React, Tailwind, and code Playground

by andypotanin

JavaScript

console.clear();

function Core(name, settings) {
    this.name = name;
    this.settings = settings;
    this.type = 'Core';
    //this.context_test = function () { console.log('I am in', this); }
    //console.log('Core', this);
    return this;
}

Object.defineProperties( Core.prototype, {
    Module: {
        get: function Module() {
            
            // Create object in Core's context
            return Object.create( this, arguments.callee.prototype );
    
        }
    }
    
})

Object.defineProperties( Core.prototype.Module.prototype, {
    name: { value: arguments.callee },
    do_stuff: { value: function( stuff ) { this._stuff = stuff; return this; } },
    settings: { value: this.settings || {} },
    path: { value: [ this.name, arguments.callee ] }
    SubModule: { 
        get: function SubModule(name, settings) {

            // Create object in Core's context
            return Object.create( this, arguments.callee.prototype );
        }
    }
});

var myCore = new Core('Chevy', 'asdf');; // has .Module()
var myModule = myCore.Module.do_stuff( 'stuff' ); // type: Module, .SubModule()

console.log( myModule );
console.log( myCore );

//var myModule = myCore.Module('Denali'); // type: Module, .Module()

// Non-instantiated is ran within "prototype" context and has access to self in "this".
//var myModule = Core.prototype.Module('Denali');

//var mySubModule = new myModule.SubModule( 'Hybrid-Hoe' );

var created = Object.create(myCore, {
    name: {
        value: 'HoodChevy',
        enumerable: true
    },
    own_thing: {
        value: 'blah',
        enumerable: false
    },
    amother_thing: {
        value: 'blah visible',
        enumerable: true
    }
});
//console.log( Object.keys( created ) );
//console.log( Object.keys( created.__proto__ ) );
//console.log( created.__proto__ );
//console.log(created);
//myCore.context_test();
//created.context_test();
//console.log(created instanceof Core);