Maison >interface Web >js tutoriel >Comment l'héritage prototypique de Crockford gère-t-il les objets imbriqués et la modification des propriétés ?
Héritage prototypique de Crockford : problèmes liés aux objets imbriqués
Le modèle d'héritage prototypique de Douglas Crockford, décrit dans son livre "Javascript : les bonnes pièces", simplifie l'héritage des objets et évite la confusion associée au mot-clé "new". Cependant, lorsque vous tentez d'hériter d'objets imbriqués à l'aide de ce modèle, un problème survient : l'écrasement d'une propriété d'objet imbriqué affecte l'ensemble de la chaîne de prototypes.
Considérez le code suivant :
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
Dans ce Par exemple, après avoir hérité de l'objet imbriqué nestObj, la modification d'une propriété de l'objet imbriqué dans person2 affecte le prototype nestObj, et de même pour l'objet imbriqué de person3. Il s'agit d'un comportement inattendu qui va à l'encontre de l'objectif du modèle, qui est d'isoler les modifications apportées aux objets individuels.
La raison de cette incohérence réside dans la nature fondamentale de l'héritage dans les objets JavaScript. Lorsqu'un objet hérite d'un autre, il crée une référence aux propriétés de cet objet plutôt que de créer des copies indépendantes. Cela signifie que toute modification apportée aux propriétés héritées sera reflétée à la fois dans l'objet enfant et dans le prototype.
Pour éviter ce problème, il faut explicitement créer un nouvel objet pour les propriétés imbriquées avant d'en hériter. Cela garantit que les modifications apportées aux propriétés imbriquées sont isolées dans l'objet enfant. Par conséquent, le code correct devrait être :
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!