Maison > interface Web > js tutoriel > Quand devriez-vous éviter « Child.prototype = Parent.Prototype » dans l'héritage JavaScript ?

Quand devriez-vous éviter « Child.prototype = Parent.Prototype » dans l'héritage JavaScript ?

Patricia Arquette
Libérer: 2024-11-14 10:28:02
original
456 Les gens l'ont consulté

When Should You Avoid `Child.prototype = Parent.Prototype` in JavaScript Inheritance?

Quand éviter Child.prototype = Parent.Prototype dans l'héritage JavaScript

Bien qu'il soit courant d'hériter en JavaScript en utilisant Child.prototype = new Parent();, il existe des exceptions où Child.prototype = Parent.Prototype peut provoquer des comportements inattendus.

Considérez l'extrait suivant :

function GameObject(oImg, x, y) {

    this.x = x;
    this.y = y;
    this.img = oImg;

    this.hit = new Object();
    this.hitBox.x = x;
    this.hitBox.y = y;
    this.hitBox.width = oImg.width;
    this.hitBox.height = oImg.height;

}

Spaceship.prototype = new GameObject();
Spaceship.prototype.constructor = Spaceship;

function Spaceship(){
    console.log("instantiate ship");
    GameObject.apply(this, arguments);
    this.vx = 0;
    this.vy = 0;
    this.speed = 3;
    this.friction = 0.94;
}
Copier après la connexion

Lors de l'inspection du constructeur du vaisseau spatial, vous' Vous remarquerez que sa propriété __proto__ pointe vers Spaceship, pas vers GameObject. En effet, les lignes :

this.hitBox.width = oImg.width;
this.hitBox.height = oImg.height;
Copier après la connexion

attribuent des propriétés directement à this.hitBox, qui n'existe pas dans le prototype GameObject. Ce comportement est problématique car il :

  • Rompe l'héritage : lors de l'utilisation de Child.prototype = Parent.Prototype, le prototype Enfant n'hérite d'aucune nouvelle fonction ajoutée au prototype Parent.
  • Viole l'instance de vérification : comme le __proto__ de l'instance Spaceship pointe vers Spaceship au lieu de GameObject, la vérification si (instance d'objet de GameObject) échouera.

Pourquoi utiliser Child.prototype = new Parent() ; Au lieu de cela

Child.prototype = new Parent(); appelle le constructeur de la classe Parent et attribue son instance nouvellement créée au prototype Child. Cela garantit que :

  • L'héritage est préservé : toute nouvelle fonction ajoutée au prototype Parent sera automatiquement héritée par l'enfant.
  • l'instance de vérification est exacte : Le __proto__ de l'instance Enfant pointe vers le prototype Parent, permettant l'instance de vérification correcte.

Solution alternative

Dans les navigateurs modernes prenant en charge Object.create, vous pouvez utiliser Spaceship.prototype = Objet.create(GameObject.prototype); pour créer le prototype enfant. Ceci est fonctionnellement équivalent à Child.prototype = new Parent(); mais est plus concis et évite l'appel inutile du constructeur.

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