JSFiddle - React, Tailwind, and code Playground

HTML

<pre id="x"></pre>

JavaScript

var output = document.getElementById("x");
function Log()
{
    console.log(arguments);
    output.innerHTML += Array.prototype.slice.call(arguments).join(" - ") + "\n";
}
/* -------------------------------------------*/
function isPlainObject(obj)
{
    if (typeof (obj) !== "object" || obj.nodeType || (obj instanceof Window))
        return false;
    
    try
    {
        if (obj.constructor &&
            !({}).hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf"))
        {
            return false;
        }
    }
    catch (e)
    {
        return false;
    }
    
    return true;
}

function extend(deep, target, source)
{
    var copy, original, clone;
    for (var attr in source)
    {
        copy = target[attr];
        original = source[attr];
        
        if (target === original)
            continue;
        
        // se for uma cópia profunda e o objeto for simples
        if (deep && original && isPlainObject(original))
        {
            // obtem um objeto simples vazio para ser estendido
            
            if (original instanceof Array)
            {
                clone = copy && (copy instanceof Array) ? copy : [];
            }
            else
            {
                clone = copy ? copy : {};
            }
            
            // recursivamente estende o objeto interno 
            target[attr] = extend(deep, clone, original);
        }
        else if (original !== undefined)
        {
            // copia o valor para o objeto de destino
            // caso o objeto seja uma referencia o valor não é clonado
            target[attr] = original;
        }
    }
    
    // retorna o objeto estendido
    return target;
}

function Pessoa(params)
{
    this.id = params['id'];
    this.nome = params['nome'];
    this.pai = null;
    this.toString = function () { return this.nome };
}

var luke = new Pessoa({ id: 1, nome: 'Luke' });
var vader = new Pessoa({ id: 2, nome: 'Darth' });
luke.pai = vader;
vader.pai...