Maison >interface Web >js tutoriel >Pourquoi la propriété « constructeur » de JavaScript n'est-elle pas mise à jour pendant l'héritage prototypique ?

Pourquoi la propriété « constructeur » de JavaScript n'est-elle pas mise à jour pendant l'héritage prototypique ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-01 05:05:17621parcourir

Why Doesn't JavaScript's `constructor` Property Update During Prototypal Inheritance?

Héritage JavaScript : Comprendre la propriété Constructeur

Question :

Considérez le code :

function a() {}
function b() {}
function c() {}

b.prototype = new a();
c.prototype = new b();

console.log((new a()).constructor); //a()
console.log((new b()).constructor); //a()
console.log((new c()).constructor); //a()

Pourquoi la propriété constructeur n'est-elle pas mise à jour pour b et c, malgré définir leur prototype pour qu'il hérite d'un ?

Réponse :

Pour comprendre cela, embarquons-nous dans un voyage conceptuel :

  • Lors de la création une fonction comme function Foo() {}, JavaScript crée en interne une instance de fonction (la fonction constructeur).
  • Chaque fonction constructeur a un prototype propriété, qui est un pointeur vers son objet prototype.
  • L'objet prototype a une propriété constructeur qui renvoie à sa fonction constructeur.
  • Lors de la création d'une nouvelle instance de Foo avec new Foo() , un nouvel objet est créé, et sa propriété interne [[proto]] pointe vers le prototype du constructeur.

Maintenant, la question se pose : pourquoi le propriété de constructeur définie sur l'objet instance lui-même ? Prenons l'exemple suivant :

function defclass(prototype) {
  var constructor = prototype.constructor;
  constructor.prototype = prototype;
  return constructor;
}

var Square = defclass({
  constructor: function (side) { this.side = side; },
  area: function () { return this.side * this.side; }
});

var square = new Square(10);

console.log(square.area()); // 100

Dans cet exemple, la propriété constructor est une méthode du prototype comme les autres. Cependant, il est utilisé spécifiquement pour initialiser les instances du prototype.

Définir la propriété constructeur sur le prototype offre plusieurs avantages :

  • Correction logique : par exemple, Object.prototype.constructor pointe vers Objet. S'il était défini sur l'instance, il ne serait pas défini pour Object.prototype puisqu'il s'agit d'une instance de null.
  • Cohérence avec les autres méthodes prototypes : cela simplifie l'implémentation de new, qui n'a pas besoin d'être défini. la propriété constructeur sur chaque instance.
  • Efficacité : toutes les instances partagent la même propriété constructeur, réduisant ainsi la mémoire surcharge.

Héritage et propriété du constructeur

Dans le cas de l'héritage, la propriété prototype du constructeur dérivé est définie sur une instance du constructeur de base . Par conséquent, la propriété interne [[proto]] de l'instance du constructeur dérivé pointe également vers le prototype du constructeur de base. Il en résulte que la propriété constructeur de l'instance de constructeur dérivé pointe vers le constructeur de base.

L'opérateur instanceof

L'opérateur instanceof opère sur un objet instance et une fonction constructeur. Contrairement à la croyance populaire, il ne repose pas sur la propriété constructeur de l’instance. Au lieu de cela, il parcourt la chaîne de prototypes de l'instance et vérifie si sa propriété interne [[proto]] correspond à la propriété prototype du constructeur. Une correspondance renvoie vrai, tandis qu'une fin de chaîne de prototypes renvoie faux.

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!

Déclaration:
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