5

私は OO JS を書くのにかなり慣れていませんが、これは私を困惑させました。そこで、新しい Call オブジェクトをセットアップしてから、空の配列であると想定するものを定義します。AddFieldQueryToArray() を呼び出すと、

Uncaught TypeError: Cannot call method 'push' of undefined 

の上this.fieldArray.push(field)

理由はよくわかりません。私this.fieldArray = fieldArray;もコンストラクタで試しました。

    function Call() 
    {    
         var fieldArray = new Array();
         var queryArray = new Array();
    }

    Call.prototype.AddFieldQuerysToArray = function(field,query)
    {
        if(field !== 'undefined')
        {               
            this.fieldArray.push(field);
        }

        this.queryArray.push(query);

    }
4

3 に答える 3

10

this.コンストラクター内でインスタンス プロパティを参照する必要があります。

function Call() 
{    
     this.fieldArray = [];
     this.queryArray = [];
}

new Array()上記で使用したショートカット[]があります。

使用するvar fieldArray = [];場合は、この種の構成を使用しない限り、インスタンスが作成されると破棄されるローカル変数を作成します。

function Call()
{
    var fieldArray = [];

    this.AddFieldQuerysToArray = function(field, query) {
        // ...
        fieldArray.push(field);
    }
}

これにより、fieldArrayインスタンスの存続期間を通じて「存続」する各インスタンスのクロージャが作成されます。

于 2013-06-10T09:11:15.637 に答える
1
function Call() 
{
    this.fieldArray = [];
    this.queryArray = [];       
}


Call.prototype.AddFieldQuerysToArray = function(field,query)
{
    if(field !== 'undefined')
    {
        alert('field==='+this.fieldArray);
        this.fieldArray.push(field);
    }
    alert('field==='+this.fieldArray);  
    this.queryArray.push(query);
alert(this.queryArray);// to check
alert(this.fieldArray);// to check
};

field = 'exampleField';
query = 'exampleField';

var cally = new Call();
cally.AddFieldQuerysToArray(field,query); //change

唯一の問題は、メソッドを呼び出していてCall.prototype.AddFieldQuerysToArray()、ここでこの値が実際には配列とCall.prototypeを持たないオブジェクトの実行コンテキストを参照していたことです。fieldArrayqueryArray

AddFieldQuerysToArray()コーディングによるプロトタイプ メソッドの呼び出しは、コンストラクターを介して宣言された両方の配列を取得しcally.AddFieldQuerysToArray(field,query);たインスタンスの実行コンテキストを参照します。cally

于 2013-06-10T09:51:10.770 に答える