Heim >Web-Frontend >js-Tutorial >Wie geht Crockfords prototypische Vererbung mit verschachtelten Objekten und deren Vererbung um?
Crockfords prototypische Vererbung: Verschachtelte Objekte und Vererbung
Douglas Crockfords „Javascript: The Good Parts“ plädiert für die Vereinfachung der Objektvererbung durch die Nutzung des Objekts .create()-Methode verwenden, um die Fallstricke des neuen Schlüsselworts zu vermeiden. Es bestehen jedoch Bedenken hinsichtlich des Verhaltens verschachtelter Objekte bei Verwendung dieses Musters.
Um das Problem zu veranschaulichen, betrachten Sie das folgende Beispiel:
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);
Im obigen Beispiel erbt das Objekt person1 vom flatObj und das person2-Objekt erbt vom nestObj. Wenn eine Eigenschaft eines verschachtelten Objekts innerhalb eines geerbten Objekts geändert wird, wirkt sich dies auf das verschachtelte Objekt weiter oben in der Prototypenkette aus.
person1.age = 69; // Overwrites `age` in `person1` person2.info.age = 96; // Overwrites `age` in `person2` and `nestObj`
Infolgedessen wird das ursprüngliche verschachtelte Objekt geändert, auch wenn die Änderung beabsichtigt war ausschließlich für das geerbte Objekt.
Dieses Verhalten ist für flache Objekte nicht konsistent. Wenn flatObj.age geändert wird, wirkt sich dies nicht auf die Alterseigenschaft von person1 aus.
flatObj.age = 23; // Only affects `flatObj`
Die Inkonsistenz entsteht, weil verschachtelte Objekte in diesem Vererbungsmuster anders behandelt werden als flache Objekte.
Behebung der Einschränkung
Die Einschränkung des Musters mit verschachtelten Objekten kann durch die Erstellung unabhängiger Objekte behoben werden für verschachtelte Eigenschaften, bevor Sie sie zuweisen:
person3 = { sex: "male" } person3.info = Object.create(nestObj2.info);
Dadurch wird die Info-Eigenschaft von person3 zu einem unabhängigen Objekt, das von Änderungen, die am verschachtelten Objekt in der Prototypenkette vorgenommen werden, nicht betroffen ist.
Allerdings , ist es wichtig zu beachten, dass dieser Ansatz keine völlig unabhängigen Objekte erstellt. Wenn eine Eigenschaft des verschachtelten Objekts am geerbten Objekt gelöscht wird, wird sie auch vom Prototypobjekt gelöscht:
delete child.x; // (child).x.a == 0, because child inherits from parent
Zusammenfassend lässt sich sagen, dass das prototypische Vererbungsmuster von Crockford mit verschachtelten Objekten Einschränkungen aufweist. Diese Einschränkungen können jedoch teilweise behoben werden, indem unabhängige Objekte für verschachtelte Eigenschaften erstellt werden, bevor diese zugewiesen werden.
Das obige ist der detaillierte Inhalt vonWie geht Crockfords prototypische Vererbung mit verschachtelten Objekten und deren Vererbung um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!