web-dev-qa-db-fra.com

Constructeur ou fonction init pour un objet

Je cherchais un constructeur ou une fonction init pour la situation suivante:

var Abc = function(aProperty,bProperty){
   this.aProperty = aProperty;
   this.bProperty = bProperty;
}; 
Abc.prototype.init = function(){
   // Perform some operation
};

//Creating a new Abc object using Constructor.

var currentAbc = new Abc(obj,obj);

//currently I write this statement:
currentAbc.init();

Existe-t-il un moyen d'appeler la fonction init lorsque le nouvel objet est initialisé?

16
emphaticsunshine

Vous pouvez simplement appeler init() à partir de la fonction constructeur

var Abc = function(aProperty,bProperty){
   this.aProperty = aProperty;
   this.bProperty = bProperty;
   this.init();
}; 

Voici un violon démontrant: http://jsfiddle.net/CHvFk/

20
Matt Greer

Peut-être quelque chose comme ça?

var Abc = function(aProperty,bProperty){
    this.aProperty = aProperty;
    this.bProperty = bProperty;
    this.init = function(){
        // Do things here.
    }
    this.init();
}; 
var currentAbc = new Abc(obj,obj);
12
James Hay

si votre méthode init doit rester privée:

var Abc = function(aProperty,bProperty){
   function privateInit(){ console.log(this.aProperty);}   
   this.aProperty = aProperty;
   this.bProperty = bProperty;

   privateInit.apply(this);
};

j'aime plus ça 

5

Et ça?

var Abc = function(aProperty,bProperty){
    this.aProperty = aProperty;
    this.bProperty = bProperty;

    //init
    (function () {
        // Perform some operation
    }.call(this));
}; 
var currentAbc = new Abc(obj,obj);
1
ViES

Le constructeur devrait être l'endroit où initialiser votre instance. Si la méthode init n'est pas censée être réexécutée, conservez le code associé à l'initialisation dans le constructeur et scindez plutôt le code en plusieurs sous-méthodes spécifiques (de préférence privées) s'il devient trop gros et compliqué.

Cela dit, si vous devez avoir la possibilité de réexécuter ou d’appeler la méthode init de manière ' asynchrone ', la solution que je trouve la plus flexible est de renvoyer this à partir de votre méthode init. De cette façon, vous pouvez créer une instance, l'assigner à une variable et appeler votre méthode init encore distincte sur une ligne.

var Abc = function(aProperty){
   this.aProperty = aProperty;
};
Abc.prototype.init = function(){
  // init stuff
  return this;
};
// either as oneliner
var abc = new Abc().init();
// or 
var abc = new Abc();
setTimeout(function(){abc.init()},500);
0
Marcello di Simone