0
votes

Pourquoi «Super` SUPER` Mots-clés revient-il non défini dans une classe ES6?

Je suis nouveau dans les cours ES6 et essayez de comprendre comment l'héritage fonctionne. J'ai créé une classe parent modal code> et une classe enfant Childmodal code> comme ceci:

p>

<!DOCTYPE html>
<html>
<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
	<title>Class test</title>
	<h1 id="mainTitle">
		Main title
	</h1>
	<h2 id="childTitle">
		Child title
</head>
<body>
	<script src="Modal.js"></script>
</body>
</html>


3 commentaires

L'enfant hérite de la classe , pas l'instance modale que vous avez faite. Pensez au fait que vous pourriez faire 20 instances modales différentes; Lequel conduirait l'héritage?


Que se passe-t-il si, au lieu de modal.title = "standards"; vous essayez modal.pototype.title = "normes"; ?


Dans votre constructeur ChildModal , il reçoit 2 paramètres, n'est-ce que vous venez de passer #chidtitle comme premier para, où est le 2ème?


3 Réponses :


1
votes

Vous devez définir _title code> dans votre constructeur: xxx pré>

vous rejoignez actuellement une chaîne code> avec non défini Code> qui donne dans non défini code>. p>

Puisque vous créez deux instances, ils ne se rapportent pas les uns aux autres, donc enfant.title code> isn ' T la même chose que modal.title code>, ainsi concaténant que les deux résultent de deux chaînes différentes. p>

Donc, vous avez non seulement besoin de définir le titre dans modal.title = 'Normes JavaScript' Code>, mais vous devez également définir la même chose sur ENFANT.TITLE = 'NORMES JavaScript' CODE>. P>

P>

<!DOCTYPE html>
<html>
<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
	<title>Class test</title>
	<h1 id="mainTitle">
		Main title
	</h1>
	<h2 id="childTitle">
		Child title
</head>
<body>
	<script src="Modal.js"></script>
</body>
</html>


3 commentaires

Vous devez définir le titre sur le variateur enfant.title car les instances de deux classes ne sont pas liées depuis que vous avez utilisé nouveau sur chacun.


Cela signifie-t-il que je n'ai pas à définir _title dans le constructeur?


J'ai mis à jour le constructeur pour ressembler à ceci: this.title = '' , vous devez l'avoir dans le constructeur, en quelque sorte, car avoir une valeur par défaut de non défini n'est probablement pas La meilleure idée ici puisque vous savez que la valeur sera toujours une chaîne.



2
votes

Les champs de classe tels que le titre, le sélecteur et le document ne sont pas partagés entre les instances. Ainsi, lorsque vous attribuez un titre à votre variable modal , il n'influence aucune autre voie ni classes.

Lorsque les appels d'enfants super (sélecteur, titre) , il passe son argument de titre à l'initialisateur de modal . Dans la classe modal , il est ensuite stocké dans le champ .

Lorsque vous exécutez ensuite this.title = titre + ceci.title; Le champ de titre n'a aucune valeur. C'est non défini . Par conséquent, le titre finit par être "wow" + indéfini , ce qui donne "WOW non défini".


1 commentaires

Grande explication, j'ai dû lire l'autre réponse pour comprendre cependant. Merci!



0
votes

Sous la capuche, les classes ES5 utilisent toujours Prototype .

Donc, une autre solution pourrait être modifiée modal.title = "standards"; code> à modal.pototype.title = "normes"; p> P> P> P> P> P> > De cette façon, vous ne changerez pas la propriété dans l'instance, mais vous modifierez la valeur dans le prototype (alias la définition de la classe): p>

p>

<!DOCTYPE html>
<html>
<head>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
	<title>Class test</title>
	<h1 id="mainTitle">
		Main title
	</h1>
	<h2 id="childTitle">
		Child title
</head>
<body>
	<script src="Modal.js"></script>
</body>
</html>


0 commentaires