L'héritage prototypique de Crockford : objets imbriqués et héritage
"Javascript : les bonnes parties" de Douglas Crockford préconise de simplifier l'héritage des objets en utilisant l'objet .create() pour éviter les pièges du nouveau mot-clé. Cependant, des préoccupations sont apparues concernant le comportement des objets imbriqués lors de l'utilisation de ce modèle.
Pour illustrer le problème, considérons l'exemple 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);
Dans l'exemple ci-dessus, l'objet personne1 hérite du flatObj, et l'objet person2 hérite du nestObj. Lorsqu'une propriété d'un objet imbriqué est modifiée au sein d'un objet hérité, cela affecte l'objet imbriqué en amont de la chaîne de prototypes.
person1.age = 69; // Overwrites `age` in `person1` person2.info.age = 96; // Overwrites `age` in `person2` and `nestObj`
En conséquence, l'objet imbriqué d'origine est modifié, même si le changement était intentionnel. uniquement pour l'objet hérité.
Ce comportement n'est pas cohérent pour les objets plats. Si flatObj.age est modifié, cela n'affecte pas la propriété age de person1.
flatObj.age = 23; // Only affects `flatObj`
L'incohérence survient car les objets imbriqués sont traités différemment des objets plats dans ce modèle d'héritage.
Résoudre la limitation
La limitation du modèle avec des objets imbriqués peut être résolue en créant des objets indépendants pour les propriétés imbriquées avant de les attribuer :
person3 = { sex: "male" } person3.info = Object.create(nestObj2.info);
Ce faisant, la propriété info de person3 devient un objet indépendant, non affecté par les modifications apportées à l'objet imbriqué en amont de la chaîne de prototypes.
Cependant, il est important à noter que cette approche ne crée pas d'objets complètement indépendants. Si une propriété de l'objet imbriqué est supprimée au niveau de l'objet hérité, elle sera également supprimée de l'objet prototype :
delete child.x; // (child).x.a == 0, because child inherits from parent
En résumé, le modèle d'héritage prototypique de Crockford avec des objets imbriqués a des limites. Cependant, ces limitations peuvent être partiellement résolues en créant des objets indépendants pour les propriétés imbriquées avant de les attribuer.
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!