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) {
...