web-dev-qa-db-fra.com

Appel d'une méthode dans un constructeur Javascript et accès à ses variables

J'essaie d'appeler une méthode à partir du constructeur de mon constructeur javascript, est-ce possible et si c'est le cas, je n'arrive pas à le faire fonctionner, tout aperçu serait génial! Merci!

function ValidateFields(pFormID){
    var aForm = document.getElementById(pFormID);
    this.errArray = new Array();//error tracker
    this.CreateErrorList();
}
/*
 * CreateErrorList()
 * Creates a list of errors:
 *   <ul id="form-errors">
 *    <li>
 *     You must provide an email.
 *    </li>
 *   </ul>
 * returns nothing
 */
 ValidateFields.prototype.CreateErrorList = function(formstatid){
     console.log("Create Error List");
 }

Je l'ai fait fonctionner avec ce qui est ci-dessus, mais je n'arrive pas à accéder à la variable 'errArray' dans la fonction CreateErrorList.

29
alvincrespo

Oui, il est possible, lorsque votre fonction constructeur s'exécute, la valeur this a déjà le [[Prototype]] propriété interne pointant vers le ValidateFields.prototype objet.

Maintenant, en examinant votre modification, la variable errArray n'est pas disponible dans la portée de la méthode CreateErrorList, car elle n'est liée qu'à la portée du constructeur lui-même.

Si vous devez garder cette variable privée et autoriser uniquement la méthode CreateErrorList à y accéder, vous pouvez la définir comme un méthode privilégiée , au sein du constructeur:

function ValidateFields(pFormID){
  var aForm = document.getElementById(pFormID);
  var errArray = [];

  this.CreateErrorList = function (formstatid){
    // errArray is available here
  };
  //...
  this.CreateErrorList();
}

Notez que la méthode, puisqu'elle est liée à this, ne sera pas partagée et qu'elle existera physiquement sur toutes les instances d'objet de ValidateFields.

Une autre option, si cela ne vous dérange pas d'avoir la variable errArray, en tant que propriété publique de vos instances d'objet, vous avez juste pour l'affecter à l'objet this:

//..
this.errArray = [];
//..

Plus d'informations:

19
CMS

Solution:

function ValidateFields(pFormID){
    console.log("ValidateFields Instantiated");
    var aForm = document.getElementById(pFormID);
    this.errArray = new Array();//error tracker
    this.CreateErrorList(); //calling a constructors method
}

ValidateFields.prototype.CreateErrorList = function(){
   console.log("Create Error List");
   console.log(this.errArray); //this is how to access the constructors variable
}

J'espère que cela aidera quiconque pourrait avoir une question comme celle-ci à l'avenir.

7
alvincrespo

Créez-vous un objet de ValidateFields quelque part?

Edit : Vous devez ajouter this avant de faire référence aux propriétés publiques d'une fonction.

Mise à jour du code ici: http://jsbin.com/afiru/edit

0
Anurag