覆盖对象的克隆属性JavaScript超出了最大调用堆栈大小

时间:2013-05-27 07:23:33

标签: 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] == "object") {
            newObj[i] = this[i].clone();
        } else
            newObj[i] = this[i]
    }
    return newObj;
}

我还为window object添加了一些属性。

修改

实际上我在我的代码中使用了几个库。当我没有这些库运行此方法时,它工作正常。但是使用这些库会出现这个错误。他们可能已经提供了自己的克隆实现。

现在,当我调用此方法时,我得到了Maximum call stack size exceeded

任何帮助? 谢谢

1 个答案:

答案 0 :(得分:0)

在普通Object {}上尝试使用您的方法可以正常工作,与Array []

一起使用时会遇到问题

我不完全确定这是你在找什么,但它解决了这个问题:

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;
};

如果您的ObjectArray的实例,则无需以此方式克隆它,我相信您可以将其返回并停止该功能。请参阅this JSFiddle