web-dev-qa-db-fra.com

Classe JavaScript - Méthode d'appel lors de l'initialisation de l'objet

J'ai une classe similaire à celle ci-dessous. Comment appeler ma méthode init lorsque l'objet est créé? Je ne veux pas avoir à créer une instance de mon objet puis appeler initialize comme je le fais ci-dessous. 

var myObj = new myClass(2, true);
myObj.init();

function myClass(v1, v2) 
{
    // public vars
    this.var1 = v1;

    // private vars
    var2 = v2;

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // private methods
    someMethod = function() {
        // do some private stuff
    };
}
17
Ryan Sampson

NB Les noms de fonction de constructeur doivent commencer par une lettre majuscule pour les distinguer des fonctions ordinaires, par ex. MyClass au lieu de myClass.

Soit vous pouvez appeler init à partir de votre fonction constructeur:

var myObj = new MyClass(2, true);

function MyClass(v1, v2) 
{
    // ...

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // ...

    this.init(); // <------------ added this
}

Ou plus simplement, vous pouvez simplement copier le corps de la fonction init à la fin de la fonction constructeur. Nul besoin d'avoir réellement une fonction init si elle n'est appelée qu'une fois.

31
Daniel Earwicker

Il y a une manière encore plus douce de faire ceci:

this.init = function(){
  // method body
}();

Cela créera à la fois une méthode et l'appellera. 

7
Kunok

Voir ci-dessous une réponse possible et quelques corrections à apporter à votre code.

function myClass(v1, v2) 
{
    // public vars
    this.var1 = v1;

    // private vars
    // use var to actually make this private
    var var2 = v2;

    // pub methods
    this.init = function() {
        // do some stuff        
    };

    // private methods
    // this will be private as though it had been declared with var
    function someMethod() {
        // do some private stuff
    };

    //call init
    this.init();
}
3
jbeard4

Il suffit d'ajouter

this.init();

à votre fonction myClass.

1
harpo

Les classes JavaScript introduites dans ECMAScript 2015 sont principalement du sucre syntaxique par rapport à l'héritage existant de JavaScript basé sur un prototype. La syntaxe de la classe n'introduit pas un nouveau modèle d'héritage orienté objet dans JavaScript. Les classes JavaScript fournissent une syntaxe beaucoup plus simple et claire pour créer des objets et gérer l'héritage.

- Documents Web MDN

Lorsque vous utilisez cette syntaxe, étant donné que seule la méthode constructor() est exécutée à l’instanciation, vous ne pouvez pas instancier automatiquement un objet. Vous devez toujours ajouter user = new MyUser() 

var user;

class MyUser {
  constructor(var1, var2) {

    this.var1 = var1;
    this.var2 = var2;

  }

  static staticMethod() {

    // accessed directly with the class name `MyUser`

  }

  instanceMethod() {

    // accessed with object instance
return true
  }

}

user = new MyUser('hey','there')

1
Ivan