Maison >interface Web >js tutoriel >L'héritage prototypique de Crockford gère-t-il correctement les objets imbriqués ?
L'héritage prototypique de Crockford : problèmes liés aux objets imbriqués
Dans son livre "Javascript : les bonnes pièces", Douglas Crockford présente un modèle pour simplifier héritage d'objet. Ce modèle est basé sur la méthode Object.create, qui permet la création d'un nouvel objet basé sur un objet prototype existant.
Bien que ce modèle fonctionne bien pour les objets plats, des problèmes surviennent lors du traitement d'objets imbriqués. L'écrasement d'une valeur d'un objet imbriqué hérité à l'aide de ce modèle affecte l'élément imbriqué tout au long de la chaîne de prototypes.
Par exemple, dans 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);
Modification de la propriété age de person1 met à jour la propriété age de flatObj, mais la modification de la propriété age de person2.info met à jour de manière incorrecte la propriété age de nestObj.info.
Ce comportement est pas inhérent à l'héritage prototypique mais plutôt à la façon dont JavaScript gère les objets imbriqués. En JavaScript, une propriété d'un objet peut être soit une propriété propre (définie sur l'objet lui-même), soit une propriété héritée (accessible via la chaîne de prototypes). Lorsqu'un objet est créé à l'aide de Object.create, il hérite de toutes les propriétés propres de son objet prototype.
Pour éviter ce problème, les objets imbriqués doivent être attribués explicitement au nouvel objet. Dans l'exemple ci-dessus, le code suivant créerait un objet d'information indépendant pour personne2 :
var person2 = Object.create(nestObj); person2.info = Object.create(nestObj.info);
Cette séparation des objets imbriqués garantit que les modifications apportées à l'objet d'information de personne2 n'affectent pas l'objet d'information de nestObj.
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!