Javascript 遍历对象';s属性列出了原型中的内容

Javascript 遍历对象';s属性列出了原型中的内容,javascript,prototype,Javascript,Prototype,我试图创建一个“复制”函数,并将其添加到对象的原型中。我计划递归地进行类型检查,并将属性分配给一个新对象,然后返回该对象。。。但是,似乎有一个问题,请参见以下代码片段: Object.prototype.copy = function() { for (prop in this) { console.log(prop); //Logs copy (the function)!!! } } x = {"a": 1}; y = x.copy(); 正如我在

我试图创建一个“复制”函数,并将其添加到对象的原型中。我计划递归地进行类型检查,并将属性分配给一个新对象,然后返回该对象。。。但是,似乎有一个问题,请参见以下代码片段:

Object.prototype.copy = function()
{
    for (prop in this)
    {
        console.log(prop); //Logs copy (the function)!!!
    }
}

x = {"a": 1};
y = x.copy();
正如我在评论中指出的,我发现了这种非常奇怪的行为,但为什么会发生这种情况呢?复制函数应该在
对象.原型中,而不是在实例化对象本身中!我怎么修理它?我可以只设置
this.copy=undefined
,并且仍然依赖
Object.prototype.copy

根据要求,这是完整的代码示例:

Object.prototype.copy = function()
{
    var object = this; //The object we are copying.
    var newObject = {}; //The object we will return.

    //Cycle through the properties of the object we are creating, copy them recursively.
    for (prop in object)
    {
        if (!Object.prototype.hasOwnProperty.call(this, prop) || object[prop] == null)
        {
            continue;
        }

        if (prop == "copy")
        {
            console.log("Well, blah."); //This never prints!
        }

        if (typeof(object[prop]) == "object" && !(object[prop] instanceof Array)) //If the object's property is another object...
        {
            newObject[prop] = object[prop].copy(); //Set the copy of it to the new object as well.
            console.log("1 --- " + prop); //This prints copy - two times! That defies logic!
        }
        else if (typeof(object[prop]) == "object") //If it's an array...
        {
            newObject[prop] = object[prop].slice(); //Do it in a nicer fashion.
            console.log("2 --- " + prop);
        }
        else //You're safe to copy it.
        {
            newObject[prop] = object[prop];
            console.log("3 --- " + prop + " --- " + object[prop]);
        }
    }

    return newObject;
}
您可以使用一个名为“hasOwnProperty”的方法:

 if (this.hasOwnProperty(prop)) { ... }
如果函数返回
true

如果您担心“hasOwnProperty”方法可能会损坏,可以执行以下操作:

if (Object.prototype.hasOwnProperty.call(this, prop)) { ... }
相反

较新版本的JavaScript具有更奇特的检查和控制对象的方法


编辑-由于嵌套调用“复制”,更新后的代码也会出现问题:您没有使用
var
声明“prop”,因此在调用复制对象后,“prop”的值将发生更改!(换句话说,对“copy”的每次调用都共享同一个变量。)

如果您想要执行通用的深度对象复制,并且使用jQuery,则可以使用
var obj2=jQuery.extend(true,{},obj1)
我没有使用jQuery,我想自己编写它。然后@Pointy的答案就是:
如果(Object.prototype.hasOwnProperty.call(this,prop)){…}
啊-我看到了-你忘了用
var
语句声明“prop”!啊,我不知道我必须这么做。。。我知道问题出在哪里了,它是全局的,递归函数正在为上面的函数更改prop的值,对吗?我不明白,我该怎么办?@Bane在你的
for
循环中,只记录(或其他)那些函数返回
true
的“prop”值。哦,是的,我真傻,它现在起作用了,谢谢但是这是怎么发生的,为什么发生的?嗯@Bane这就是
对于。。。在
中,循环工作。它包括直接在对象上的属性以及它继承的属性;检查“hasOwnProperty()”在我所知道的每种情况下都有效。