11552 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous
J’ai actuellement des objets très similaires et la seule façon que j’ai trouvée pour les gérer est d’utiliser une seule classe d’objets avec des switch ou des if pour distinguer les variantes.
Je sais bien que ES6+ ne fait pas à proprement parler des classes de JS de véritables classes d’objets. J’aimerais savoir s’il y a néanmoins un moyen de simuler l’héritage.
Modérateur
Hello,

PapyJP a écrit :
Bonjour à tous
J’ai actuellement des objets très similaires et la seule façon que j’ai trouvée pour les gérer est d’utiliser une seule classe d’objets avec des switch ou des if pour distinguer les variantes.
Je sais bien que ES6+ ne fait pas à proprement parler des classes de JS de véritables classes d’objets. J’aimerais savoir s’il y a néanmoins un moyen de simuler l’héritage.


C'est nouveau ça Smiley hum

Depuis l'ES6, c'est de l'objet. Avant, c'était du prototype (d'où les ambiguïtés de ce type « d'objet »)


class MotherClass{
  #privateAttribute;
  _protectedAttribute;
  publicAttribute;
  
  constructor(valPublicAttribute, valProtectedAttribute, valPrivateAttribute){
    this.publicAttribute = valPublicAttribute;
    this._protectedAttribute = valProtectedAttribute;
    this.#privateAttribute = valPrivateAttribute;
  }
  
  get privateAttribute(){
    return this.#privateAttribute;
  }
  
  get protectedAttribute(){
    return this.protectedAttribute;
  }
  
  motherMethod(val){
    return val * val;
  }
}

class DaughterClass extends MotherClass{
  constructor(one, two, three){
    super(one, two, three);
  }
  
  daughterMethod(val){
    return val + val;
  }
  
  #privateDaughterMethod(){
    return "Je ne peux pas m'exécuter en dehors de cette class";
  }
  
  static dauhterMethodStatic(){
    return "Je suis une méthod static. Pour m'exécuter, il faut faire : DaughterClass.daughterMethodStatic()";
  }
  
  _protectedMethod(){
    return "méthode protégée";
  }
  
  motherMethod(val){
    // surcharge la méthode
    return val - 1;
  }
}

let oneInstance = new DaughterClass('a', 'b', 'c');


Tu remarqueras le dièse devant un attribut et une méthode. C'est tout à fait valide en JS depuis ES2021 (de mémoire).

Pour le caractère souligné pour attribut et method, c'est valide mais ce n'est pas officiellement dans les specs de l'ecmascript. C'est simplement une de mes conventions d'écriture.
Modifié par Niuxe (28 Jul 2025 - 16:12)
Merci beaucoup !
Pendant de très nombreuses années les classes de JS (qui ne s'appelaient pas "class") n'étaient que des prototypes.
J'ai pris l'habitude de coder JS dans cette optique, et quand IE6 est arrivé j'ai pensé, à la lecture de certains documents, que ce n'était qu'un habillage et qu'à part la syntaxe on en était resté aux prototypes.

YAPUKA se plonger dans la doc pour assimiler la syntaxe...