JSFiddle - React, Tailwind, and code Playground

JavaScript

var class_type = {
    '[object Date]' : Date,
    '[object Array]' : Array,
    '[object Object]' : Object
};

function deepCopy(obj)
{
    var type = getType(obj);
    if(!type){
        throw 'Can\'t create';
    }
    var newObject = new type;
    for(prop in obj){
        var propType = getType(obj[prop]);
        if(propType){
            newObject[prop] = deepCopy(obj[prop])
        } else {
            newObject[prop] = obj[prop];
        }
    }
    return newObject;
}

function getType(variable)
{
    var type = Object.prototype.toString.call(variable);
    if(!(type in class_type)){
        return false;
    }
    return class_type[type];
}


var a = { x: 1, y: 2, z: [1, 2, 3], w: new Date(2014, 1, 1, 12, 0, 0) };
var b = deepCopy(a); // b — это отдельный объект
b.x = 10;
console.log(a.x); // 1

// a.z и b.z указывают на разные массивы:
b.z.push(4);
console.log(a.z); // [1, 2, 3]

// a.w и b.w независимы друг от друга
b.w.setYear(2015);
console.log(a.w.getFullYear()); // 2014