javascript克隆函数使用jQuery中断

javascript克隆函数使用jQuery中断,jquery,Jquery,我在javascript()中找到了这个很棒的克隆函数,但它与jquery中断,错误如下: 未捕获的TypeError:对象函数[removed]没有方法“replace” 下面是函数: Object.prototype.clone = function() { var newObj = (this instanceof Array) ? [] : {}; for (i in this) { if (i == 'clone') continue;

我在javascript()中找到了这个很棒的克隆函数,但它与jquery中断,错误如下:

未捕获的TypeError:对象函数[removed]没有方法“replace”

下面是函数:

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

replace与任何东西都有什么关系?

当您扩展
Object.prototype
时,您正在冒险。它强制in枚举中的所有
添加
hasOwnProperty
,以确保不包括
对象。prototype
扩展

jQuery并不总是包含该检查,可能是因为性能影响。因此,在这条线路的某个地方,它遇到了位于错误位置的
克隆
函数

您最好不要将它放在
对象.prototype上,而是直接放在
对象上

Object.clone = function(obj) {
    var newObj = (this instanceof Array) ? [] : {};
    for (i in this)  {

        if (obj[i] && typeof obj[i] == "object")
            newObj[i] = Object.clone(obj[i]);
        else 
            newObj[i] = obj[i]
    } 
    return newObj;
};
然后从对象调用它

var clone = Object.clone(some_object);

注意,原来的函数有一行

if (i == 'clone') continue;

这意味着您永远无法克隆名为
clone
的属性。这显然不是一件好事。

我不确定我是否理解他说的话,但有一个人说,“如果(我=='clone')继续”这句话是需要的,因为它会破坏代码或其他东西:@LordZardeck:需要克服这个事实,因为你有
Object.prototype.clone
,枚举时,每个对象都将命中该
clone
属性。如果没有该行,您克隆的每个对象都将直接添加
clone
功能。因此,在迭代过程中,您需要测试当前属性是否为
clone
属性。不幸的是,某一天您可能会有一个对象,它有自己的
clone
属性用于其他目的。此属性现在将在100%的时间内传递。通过从
Object.prototype
中删除函数,我们不再需要这一行……底线是不要向
Object.prototype
添加任何内容。有充分的理由认为这是一种不好的做法。jQuery错误就是一个例子。最后一个问题:创建Object.clone()和只创建clone()有什么区别?因为它只与clone()一起工作,但Object.clone()会打断我的一些随机部分code@LordZardeck:不确定它为什么会破坏您的代码,但它实际上与您在哪里存储
clone
无关<代码>对象
是一个函数。但是javascript中的所有函数都是对象。这意味着您可以向函数添加属性。所以我所做的就是借用
对象
函数作为名称空间来存储
克隆
函数。如果你不想,你不需要这样做。