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 gère-t-il correctement les objets imbriqués ?

Barbara Streisand
Libérer: 2024-12-11 01:49:10
original
305 Les gens l'ont consulté

Does Crockford's Prototypal Inheritance Handle Nested Objects Correctly?

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

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

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!

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