SOURCE

// 方法一: 原型链上克隆, 递归实现
//      冒充对象克隆
Object.prototype.clone = function() {
    var o = this.constructor === Array ? [] : {};
    for (var e in this) {
        o[e] = typeof this[e] === "object" ? this[e].clone() : this[e];
    }
    return o;
}

//方法二:  函数式
/*
 * 克隆一个对象
 * @param Obj
 * @returns
 */
function clone(Obj) {
    var buf;

    if (Obj instanceof Array) {
        buf = []; //创建一个空的数组
        vari = Obj.length;
        while (i--) {
            buf[i] = clone(Obj[i]);
        }
        return buf;
    } else if (Obj instanceof Object) {
        buf = {}; //创建一个空对象
        for (var k in Obj) { //为这个对象添加新的属性
            buf[k] = clone(Obj[k]);
        }
        return buf;
    } else { //普通变量直接赋值
        return Obj;
    }
}

//方法三: Object.create
function copyObject(orig) {
    // 克隆原型链上内容
    var copy = Object.create(Object.getPrototypeOf(orig));
  	// 克隆私有属性
    copyOwnPropertiesFrom(copy, orig);
    return copy;
}

function copyOwnPropertiesFrom(target, source) {
    Object
        .getOwnPropertyNames(source)
        .forEach(function(propKey) {
            var desc = Object.getOwnPropertyDescriptor(source, propKey);
            Object.defineProperty(target, propKey, desc);
        });
    return target;
}
console 命令行工具 X clear

                    
>
console