Iterieren durch Eigenschaften des Objekts listet Dinge im Prototyp

stimmen
1

Ich versuche, eine „Kopie“ -Funktion zu machen und es auf den Prototyp des Objekts hinzufügen. Ich wollte rekursiv typecheck und Eigenschaften auf ein neues Objekt zuweisen und dann das Objekt zurück ... Aber es scheint ein Problem finden Sie in diesem Code-Snippet zu sein:

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

x = {a: 1};
y = x.copy();

Wie ich im Kommentar darauf hingewiesen habe, fand ich dieses sehr seltsames Verhalten, aber warum geschieht das? Die Kopierfunktion sollte sein Object.prototype, nicht in dem instanzierten Objekt selbst! Wie kann ich es beheben? Kann ich nur gesetzt this.copy = undefined, und noch verlassen Object.prototype.copy?

Dies ist das vollständige Codebeispiel, wie gewünscht:

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;
}
Veröffentlicht am 30/06/2012 um 20:50
vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
3

Es gibt eine Methode „hasOwnProperty“ genannt, dass Sie verwenden können:

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

Wenn die Funktion gibt truedie es eine „direkte“ Eigenschaft auf dem Objekt.

Wenn Sie, dass die „hasOwnProperty“ fürchten Methode borked werden kann, können Sie dies tun:

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

stattdessen.

Neuere Versionen von JavaScript haben ausgefallenere Möglichkeiten zu untersuchen und Objekte zu steuern.

bearbeiten - auch Ihr aktualisierten Code ein Problem beinhaltet , dass aufgrund der verschachtelten Anrufe beißen würde zu „kopieren“: Sie nicht „prop“ brachten erklären mit var, so dass nach dem Aufruf ein Objekt zu kopieren, den Wert von „prop“ haben geändert! (Jeder Aufruf zu „kopieren“ teilt die gleiche Variable, mit anderen Worten.)

Beantwortet am 30/06/2012 um 20:51
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more