JSFiddle - React, Tailwind, and code Playground

by srosengren

HTML

<div id="original">
<pre id="orignal" data-bind="text: ko.toJSON($data, null, 2)"></pre>
</div>
<div id="clone">
    <pre data-bind="text: ko.toJSON($data, null, 2)"></pre>
</div>

JavaScript

var makeClone = function(original){
    var clone = Object.create(Object.getPrototypeOf(arguments[arguments.length -1])),
        getValue = function(original){
            var value = original;
            if(Object.prototype.toString.call(original) === '[object Object]')
                value = makeClone(original)
            else if(Object.prototype.toString.call(original) === '[object Array]'){
                value = [];
                for(var i = 0; i < original.length; i++)
                    value[i] = getValue(original[i]);
            }
            return value;
        };
    for(var i = 0; i < arguments.length; i++){
        for(var prop in arguments[i]){
            if(arguments[i].hasOwnProperty(prop)){
                   clone[prop] = getValue(arguments[i][prop]);
            }
        }
    }
    return clone;
}
var original = Object.create({p:'prototype'});
original.test = 'test';
original.getTest = function(){
    return this.test;   
}
original.getTest2 = function(){
    return original.test;   
}
original.sub = {
    test: 1,
        sub: {
        test: [[2,3],{sub:{test:'deep'}}]
    }
};

var clone = makeClone(original,{child: {name: 'second arg'}});

//alert(Object.getPrototypeOf(original).p);
//alert(Object.getPrototypeOf(clone).p);

original.sub.test = 2;
clone.test = 'tset';
clone.sub.sub.test.push(1);
clone.sub.sub.test[0].shift();
clone.sub.sub.test[1].sub.test = 'shallow';
//alert(clone.getTest2());

ko.applyBindings(original,document.getElementById('original'));
ko.applyBindings(clone,document.getElementById('clone'));