JSFiddle - React, Tailwind, and code Playground

by kentaromiura

JavaScript

var toString = Object.prototype.toString,
    types = /number|object|array|string|function|date|regexp|boolean/

var type = function (object) {
    if (object == null) return "null"
    var string = toString.call(object).slice(8, -1).toLowerCase()
    if (string === "number" && isNaN(object)) return "null"
    if (types.test(string)) return string
    return "object"
}

// Cloning objects and arrays
var cloneOf = function (item) {
    switch (type(item)) {
        case 'array':
            return cloneArray(item);
        case 'object':
            return cloneObject(item);
        case 'function': 
            return item;
        default:
            console.log('def:', item, JSON.stringify(item))
            return JSON.parse(JSON.stringify(item));
    }
};

var cloneObject = function (obj) {
    var clone = Object.create(obj);

    for (var key in clone) clone[key] = cloneOf(clone[key]);
    return clone;
}

var cloneArray = function (array) {
    var i = array.length,
        clone = new Array(i);
    while (i--) clone[i] = cloneOf(array[i]);
    return clone;
};




function Class(protoclass) {
    var constructor = function () {
        var proto = cloneOf(protoclass);
        var k = Object.create(null);

        for (var i = 0, max = Class.mutators.length; i < max; i++) {
            Class.mutators[i](proto, k);
        }

        for (var prop in proto) {
            if (proto.hasOwnProperty(prop)) {
                var config = {
                    value: proto[prop],
                    writable: true,
                    enumerable: true,
                    configurable: true
                };
                Object.defineProperty(k, prop, config);
            }
        }

        if (k.constructor) {
            console.log('konstrukting', arguments, k.constructor)
            k.constructor.call(k, arguments)

        }
        return k;
    }
    return constructor;

}

Class.mutators = [];
Class.mutators.push(function privatize(proto, k) {
   ...