Crockford's Prototypal Inheritance: Issues with Nested Objects
Douglas Crockford stellt in seinem Buch „Javascript: The Good Parts“ ein Muster zur Vereinfachung vor Objektvererbung. Dieses Muster basiert auf der Object.create-Methode, die die Erstellung eines neuen Objekts auf der Grundlage eines vorhandenen Prototypobjekts ermöglicht.
Während dieses Muster für flache Objekte gut funktioniert, treten beim Umgang mit verschachtelten Objekten Probleme auf. Das Überschreiben eines Werts eines verschachtelten Objekts, das mit diesem Muster geerbt wurde, wirkt sich auf das verschachtelte Element bis zur gesamten Prototypenkette aus.
Zum Beispiel im folgenden Code:
var flatObj = { firstname: "John", lastname: "Doe", age: 23 }; var person1 = Object.create(flatObj); var nestObj = { sex: "female", info: { firstname: "Jane", lastname: "Dough", age: 32 } }; var person2 = Object.create(nestObj);
Ändern der Alterseigenschaft von person1 aktualisiert die Alterseigenschaft von flatObj, aber eine Änderung der Alterseigenschaft von person2.info aktualisiert fälschlicherweise die Alterseigenschaft von nestObj.info.
Dieses Verhalten ist nicht auf die prototypische Vererbung zurückzuführen, sondern auf die Art und Weise, wie JavaScript verschachtelte Objekte verarbeitet. In JavaScript kann eine Eigenschaft eines Objekts entweder eine eigene Eigenschaft (auf dem Objekt selbst definiert) oder eine geerbte Eigenschaft (auf die über die Prototypenkette zugegriffen wird) sein. Wenn ein Objekt mit Object.create erstellt wird, erbt es alle eigenen Eigenschaften seines Prototypobjekts.
Um dieses Problem zu vermeiden, sollten verschachtelte Objekte explizit dem neuen Objekt zugewiesen werden. Im obigen Beispiel würde der folgende Code ein unabhängiges Info-Objekt für Person2 erstellen:
var person2 = Object.create(nestObj); person2.info = Object.create(nestObj.info);
Diese Trennung verschachtelter Objekte stellt sicher, dass Änderungen am Info-Objekt von Person2 keine Auswirkungen auf das Info-Objekt von nestObj haben.
Das obige ist der detaillierte Inhalt vonBehandelt Crockfords prototypische Vererbung verschachtelte Objekte korrekt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!