Вызов метода в конструкторе Javascript и доступ к его переменным - PullRequest
25 голосов
/ 19 февраля 2010

Я пытаюсь вызвать метод из конструктора моего конструктора javascript, возможно ли это, и если да, то я не могу заставить его работать, любое понимание было бы здорово! Спасибо!

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");
 }

Я получил его для работы с вышеописанным, но я не могу получить доступ к переменной 'errArray' в функции CreateErrorList.

Ответы [ 3 ]

19 голосов
/ 19 февраля 2010

Да, возможно, когда ваша функция конструктора выполняется, значение this уже имеет внутреннее свойство [[Prototype]], указывающее на объект ValidateFields.prototype.

Теперь, посмотрев на ваши правкипеременная errArray недоступна в области действия метода CreateErrorList, поскольку она связана только с областью действия самого конструктора.

Если вам необходимо сохранить эту переменную private и разрешить доступ к нему только методу CreateErrorList, вы можете определить его как привилегированный метод в конструкторе:

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

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

Обратите внимание, что метод, так как он связанна this, не будет общим и будет существовать физически на всех экземплярах объекта ValidateFields.

Другой вариант, если вы не возражаете против errArrayпеременная, как public свойство ваших экземпляров объекта, вам просто нужно присвоить его объекту this:

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

Дополнительная информация:

7 голосов
/ 19 февраля 2010

Решение:

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
}

Надеюсь, это поможет любому, у кого в будущем может возникнуть такой вопрос.

0 голосов
/ 19 февраля 2010

Вы создаете объект ValidateFields где-нибудь?

Редактировать : необходимо указывать this перед ссылками на общие свойства функции.

Обновлен код здесь: http://jsbin.com/afiru/edit

...