JSFiddle - React, Tailwind, and code Playground

by smasala

JavaScript

var list = {};

var extend = function(param, _super){
     var clazz;
     for(p in param){
            if(param.hasOwnProperty(p)){
                param[p] = Object.getOwnPropertyDescriptor(param, p);     
                if(_super[p] && $.isFunction(_super[p])){
                    param[p].value = (function(func, parent){
                        return function(){
                            this.callParent = parent;
                            var r = func.apply(this, arguments);
                            delete this.callParent;
                            return r;
                        }
                    })(param[p].value, _super[p]);
                }                
            }
        }
        var tmp = Object.create(_super);
        return Object.create(Object.getPrototypeOf(tmp), param);   
}

var define = function(name, param){
    var clazz;
    param._classname = name;
    
    if(param.extend){
        var _super = list[param.extend];
        clazz = extend(param, _super);
        
        //console.info("super", clazz, _super, Object.getPrototypeOf(tmp));
    }else{
        clazz = Object.create(param);
    }
    list[name] = clazz;
    return clazz;
}

var create = function(name, param){
    var clazz;
    if(list[name]){
        //clazz = Object.create(name, param);
        clazz = extend(param, list[name])
    }else{
        clazz = define(name, param);
    }

    if(clazz.init){
         clazz.init(123);   
    }
    
    return clazz;    
}



var a = define("MyApp.A", {
    a: 1,
    init: function(){
        console.info("in a", this);
    }
});



var b = define("MyApp.B", {
    extend:"MyApp.A",
    b: 2,
    name: function(){
        return "steve";
    },
    init:function(){
        console.info("in b", this);
        this.callParent(arguments);
    }
});

var c = define("MyApp.C", {
    extend:"MyApp.B",
    c: 3,
    init:function(){
        console.info("in c", this);
        this.callParent(arguments);
    }
});

var x =...