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; }
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;
attribuent des propriétés directement à this.hitBox, qui n'existe pas dans le prototype GameObject. Ce comportement est problématique car il :
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 :
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!