web-dev-qa-db-ja.com

JavaScriptコンストラクタでメソッドを呼び出し、その変数にアクセスする

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

上記のもので動作するようにしましたが、CreateErrorList関数の「errArray」変数にアクセスできないようです。

29
alvincrespo

はい、可能です。コンストラクター関数が実行されるとき、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にバインドされているため、sharedにはならず、ValidateFieldsのすべてのオブジェクトインスタンスに物理的に存在することに注意してください。

別のオプションとして、errArray変数をオブジェクトインスタンスのpublicプロパティとして使用することを気にしない場合は、それをthisオブジェクト:

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

より詳しい情報:

19
CMS

ソリューション:

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
}

これが将来このような質問をするかもしれない人を助けることを願っています。

7
alvincrespo

ValidateFieldsのオブジェクトをどこかに作成していますか?

Edit:関数のパブリックプロパティを参照するときは常にthisを前に付ける必要があります。

ここでコードを更新しました: http://jsbin.com/afiru/edit

0
Anurag