Heim >Web-Frontend >js-Tutorial >Wie geht Crockfords prototypische Vererbung mit verschachtelten Objekten und Eigenschaftsänderungen um?
Crockfords prototypische Vererbung: Probleme mit verschachtelten Objekten
Douglas Crockfords prototypisches Vererbungsmuster, beschrieben in seinem Buch „Javascript: The Good Parts“, vereinfacht die Objektvererbung und vermeidet die Verwirrung, die mit dem Schlüsselwort „new“ verbunden ist. Beim Versuch, mithilfe dieses Musters von verschachtelten Objekten zu erben, tritt jedoch ein Problem auf: Das Überschreiben einer verschachtelten Objekteigenschaft wirkt sich auf die gesamte Prototypenkette aus.
Beachten Sie den 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); var nestObj2 = { sex: "male", info: { firstname: "Arnold", lastname: "Schwarzenneger", age: 61 } } var person3 = { sex: "male" } person3.info = Object.create(nestObj2.info); // now change the objects: person1.age = 69; person2.info.age = 96; person3.info.age = 0; // prototypes should not have changed: flatObj.age // 23 nestObj.info.age // 96 ??? nestObj2.info.age // 61 // now delete properties: delete person1.age; delete person2.info.age; delete person3.info.age; // prototypes should not have changed: flatObj.age // 23 nestObj.info.age // undefined ??? nestObj2.info.age // 61
In this Beispielsweise wirkt sich die Änderung einer Eigenschaft des verschachtelten Objekts in person2 nach dem Erben vom verschachtelten Objekt „nestObj“ auf den Prototyp „nestObj“ aus, und das Gleiche gilt auch für „person3“. verschachteltes Objekt. Dies ist ein unerwartetes Verhalten und untergräbt den beabsichtigten Zweck des Musters, Änderungen an einzelnen Objekten zu isolieren.
Der Grund für diese Inkonsistenz liegt in der grundlegenden Natur der Vererbung in JavaScript-Objekten. Wenn ein Objekt von einem anderen erbt, erstellt es einen Verweis auf die Eigenschaften dieses Objekts, anstatt unabhängige Kopien zu erstellen. Das bedeutet, dass sich alle an den geerbten Eigenschaften vorgenommenen Änderungen sowohl im untergeordneten Objekt als auch im Prototyp widerspiegeln.
Um dieses Problem zu vermeiden, muss man explizit ein neues Objekt für verschachtelte Eigenschaften erstellen, bevor man sie erbt. Dadurch wird sichergestellt, dass Änderungen an den verschachtelten Eigenschaften auf das untergeordnete Objekt beschränkt sind. Daher sollte der korrekte Code lauten:
person3.info = Object.create(nestObj2.info); // Create a new object for the nested property person3.info.age = 0; // Change the age property without affecting the prototype
Das obige ist der detaillierte Inhalt vonWie geht Crockfords prototypische Vererbung mit verschachtelten Objekten und Eigenschaftsänderungen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!