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

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.恰当的时机返回,避免由于返回条件不正确导致的堆栈溢出

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值