覆盖对象超过了最大调用堆栈大小';s克隆属性JavaScript

覆盖对象超过了最大调用堆栈大小';s克隆属性JavaScript,javascript,object,clone,prototype,this,Javascript,Object,Clone,Prototype,This,下面是我的函数,我正在使用它覆盖对象的clone属性,以创建对象的新副本,而不仅仅是引用 Object.prototype.clone = function () { var newObj = (this instanceof Array) ? [] : {}; for (i in this) { if (i == 'clone') continue; if (this[i] && typeof this[i] == "ob

下面是我的函数,我正在使用它覆盖对象的
clone
属性,以创建对象的新副本,而不仅仅是引用

Object.prototype.clone = function () {
    var newObj = (this instanceof Array) ? [] : {};
    for (i in this)
    {
        if (i == 'clone') continue;
        if (this[i] && typeof this[i] == "object") {
            newObj[i] = this[i].clone();
        } else
            newObj[i] = this[i]
    }
    return newObj;
}
我还向
窗口对象
添加了一些属性

编辑

实际上,我在代码中使用了几个库。当我在没有这些库的情况下运行这个方法时,它工作得很好。但对于这些库,它给出了这个错误。他们可能提供了自己的克隆实现

现在,当我调用这个方法时,我得到了超过最大调用堆栈大小的

有什么帮助吗?
感谢您

在普通的
对象{}
上尝试您的方法,效果很好,当与
数组[]一起使用时会出现问题

我不完全确定这就是您要寻找的,但它解决了问题:

Object.prototype.clone = function () {
    if (this instanceof Array) return this.slice(0);
    var newObj = {};
    for (var i in this) {
        if (i == 'clone') continue;
        if (this[i] && typeof this[i] == "object") {
            newObj[i] = this[i].clone();
        } else newObj[i] = this[i];
    }
    return newObj;
};

如果您的
对象
数组
的一个实例,则不需要以这种方式克隆它,我相信您可以返回它并停止该函数。请参阅。

您确定要克隆的对象中没有循环引用吗?因为
clone
本身现在将被递归克隆。。。在你继续前行之前,先退房。@过路人不,这不是问题所在!这似乎很好@mihai尝试克隆一个空的ArrayRays也是通过引用传递的,所以它仍然值得复制:对不起,它对我不起作用。仍然给出相同的错误。@Passenger你说得对,我用
编辑了它。slice(0)
工作起来很有魅力。@DigvijayYadav是的,这可能是代码冲突的问题,我们不能对这种问题做太多…@LightStyle
.slice(0)
仍然存在陷阱:在JS中复制对象很混乱。