迭代对象的属性列出了原型中的东西

时间:2012-06-30 21:50:22

标签: 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中,而不是在实例化对象本身中!我如何解决它?我可以设置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;
}

1 个答案:

答案 0 :(得分:3)

您可以使用名为“hasOwnProperty”的方法:

 if (this.hasOwnProperty(prop)) { ... }

如果函数返回true,则它是对象的“直接”属性。

如果您担心“hasOwnProperty”方法可能会受到限制,您可以这样做:

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

代替。

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

编辑 - 您的更新代码也会涉及由于嵌套调用“复制”而导致的问题:您没有使用var声明“prop”,所以之后复制一个对象的调用,“prop”的值将会改变! (换句话说,每次调用“复制”都会共享相同的变量。)