Javascript ES6 ( node 8.4.0 et la dernière version de chrome et de Firefox )
Je m'attendais à
class Parent {
init(){
console.log("Parent init") ;
this._surname = "McClass" ;
}
constructor() {
console.log("Parent constructor") ;
this.init();
}
get surname(){
return this._surname ;
}
}
class Child extends Parent {
init(){
console.log("Child init") ;
}
constructor() {
super();
console.log("Child constructor") ;
this.init();
}
}
var child = new Child() ;
console.log(child.surname);
pour obtenir le résultat suivant ;
Parent constructor
Parent init
Child constructor
Child init
McClass
(c'est ce que donne un code C++ comparable)
Hélas, j'ai reçu ceci ;
Parent constructor
Child init
Child constructor
Child init
undefined
Est-ce que je fais quelque chose de mal ou est-ce que c'est le bon comportement à adopter et si oui, comment cela se justifie-t-il ?
EDIT ;
Voir la réponse de MinusFour ci-dessous sur la façon de réaliser ce que j'essayais de faire/attendais.
Quant à savoir pourquoi le résultat observé est le comportement "correct" et justifié ;
Comme Bergi l'a souligné (dans les commentaires), tous les appels à des méthodes d'objets en js sont effectivement "virtuels" (la dernière méthode de ce nom ajoutée à la chaîne d'héritage du prototype de l'objet étant la première trouvée et donc exécutée). Il s'avère que les appels sont toujours virtuels dans un contexte de construction de classe.
Le C++ n'applique pas le comportement des méthodes virtuelles pendant la construction, mais Java le fait et vous obtenez le même résultat (comme ci-dessus) dans un code Java comparable ; il y a donc un précédent pour le comportement observé.