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'));