JQ的clone() 用原生 prototype.clone 和 clone()方法实现

595 阅读1分钟

function clone(myobj){

 if((typeof myobj) !=  "object" ){
     return myobj;
 }
 if(myobj == null){
    return myobj;
 }

 var newobj = {};

 for(key in myobj){
    newobj[key] =  clone(myobj[key]);
 }
 return newobj;

}

Object.prototype.clone = function() {

var newObj = {};
for (var i in this) {
    if (typeof(this[i]) == 'object' || typeof(this[i]) == 'function') {
        newObj[i] = this[i].clone();
    } else {
        newObj[i] = this[i];
    }
}
return newObj;

};

Array.prototype.clone = function() {

var newArray = [];
for (var i = 0; i < this.length; i++) {
    if (typeof(this[i]) == 'object' || typeof(this[i]) == 'function') {
        newArray[i] = this[i].clone();
    } else {
        newArray[i] = this[i];
    }
}
return newArray;

};
Function.prototype.clone = function() {

var that = this;
var newFunc = function() {
    return that.apply(this, arguments);
};
for (var i in this) {
    newFunc[i] = this[i];
}
return newFunc;

};
var obj = {

name: 'byvoid',
likes: 'sdf',
display: function() {
    console.log(this.name);
}

};
var newObj = obj.clone();
console.log(newObj);
obj.likes.push("asd");
console.log(obj)
console.log(newObj)
//newObj.likes.push('python');
//console.log(obj.likes); // 输出 [ ‘node’ ]
//console.log(newObj.likes); // 输出 [ ‘node’, ‘python’ ]
//console.log(newObj.display == obj.display); // 输出 false

如果没定义 Function.prototype.clone = function (){} 会显示
Uncaught RangeError: Maximum call stack size exceeded 报错 :
用递归或者引入冲突的js库一般都是这两种原因导致的
意思为:堆栈溢出
发生原因:
递归次数过多,没有正确的退出递归造成堆栈溢出
解决方法:
1.减少递归次数,使用其他方法解决问题
2.恰当的时机返回,避免由于返回条件不正确导致的堆栈溢出

错误直译过来就是“栈溢出”,出现这个错误的原因是因为我进行了递归运算,但是忘记添加判断条件,导致递归无线循环下去。。