Maison > interface Web > js tutoriel > Comment l'héritage prototypique de Crockford gère-t-il les objets imbriqués et leur héritage ?

Comment l'héritage prototypique de Crockford gère-t-il les objets imbriqués et leur héritage ?

Barbara Streisand
Libérer: 2024-12-01 13:01:10
original
659 Les gens l'ont consulté

How Does Crockford's Prototypal Inheritance Handle Nested Objects and Their Inheritance?

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);
Copier après la connexion

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`
Copier après la connexion

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`
Copier après la connexion

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);
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal