0

this(2行目)エラーを使用する最初のステートメント:

this is undefined

行番号を確認しました。このスタイルの使用がSMessageと呼ばれる別の関数で機能することを確認しました。オブジェクトのプロパティと等しくないように引数名を変更しようとしました。this.tag_arrayに割り当てられない理由がわかりません。検証済みのtag_array1が値の配列として入力されました。

var VBPaneInit = function ( tag_array1 ) {
    this.tag_array = tag_array1;
    this.initializeTags();
    this.initializePages();

    VBPaneInit.prototype.initializeTags = function( ) {
        var element;
        for ( element = 0; element < this.tag_array.length; element++ ) 
        {
            document.getElementById( this.tag_array[element] ).onclick = vDomPageFlip;
        }
    };
    VBPaneInit.prototype.initializePages = function( ) {
        if ( this.tag_array.length === 0 )
        {
            return;
        }
        var index, page_element;
        for ( index = 0; index < this.tag_array.length; index++ ) 
        {  
            page_element = document.getElementById( this.tag_array[index] + '_page' );
            page_element.style.display = 'none';
        }
        vDomPageFlip( this.tag_array[0] );
    };
};

呼び出し

VBPaneInit( tag_array );

テストの目的で、次のように減らします。

var VBPaneInit = function( tag_array ) {
    this.tag_array = tag_array;
}

まだ行きません。

同様に機能する:

var SMessage = function ( element ) {
    this.element = element;
    SMessage.prototype.display = function( type ) {
        this.element.innerHTML = this.messages[ type ];
    };
    SMessage.prototype.messages = {
        name:         'Please enter a valid name',
        email:        'Please enter a valid email',
        pass:         'Please enter password, 6-40 characters',
        url:          'Please enter a valid url',
        title:        'Please enter a valid title',
        tweet:        'Please enter a valid tweet',
        empty:        'Please complete all fields',
        same:         'Please make emails equal',
        taken:        'Sorry, that email is taken',
        validate:     'Please contact <a class="d" href="mailto:chris@host.com">support</a> to reset your password',
        s_name:       'Please enter a valid name.',
        s_email:      'Please enter a valid email.',
        s_pass:       'Please enter password, 6-40 characters.',
        s_url:        'Please enter a valid url.',
        s_title:      'Please enter a valid title.',
        s_tweet:      'Please enter a valid tweet.',
        s_empty:      'Please complete all fields.',
        s_same:       'Please make emails equal.',
        s_taken:      'Sorry, that email is taken.',
        s_validate:   'Please contact <a class="d" href="mailto:chris@host.com">support</a> to reset your password.'
    };
};
4

2 に答える 2

5

オブジェクトを作成するには が必要thisだと言っているわけではないので、ありません。new VBPaneInit(tag_array)new

次の問題は、次の 2 つの異なる方法でプロトタイプを正しく構築していないことです。

  1. vBPaneInitは と同じではありませんVBPaneInit。JavaScript では大文字と小文字が区別されます。
  2. コンストラクター関数内にプロトタイプを設定しようとしているので、最初にオブジェクトを作成するときにプロトタイプが存在せず、オブジェクトを作成するたびにそれを行うことになります。

あなたはもっとこのようなことをしているはずです:

var VBPaneInit = function(tag_array1) {
    this.tag_array = tag_array1;
    this.initializeTags();
    this.initializePages();
};
VBPaneInit.prototype.initializeTags = function() {
    var element;
    for (element = 0; element < this.tag_array.length; element++) {
        document.getElementById(this.tag_array[element]).onclick = vDomPageFlip;
    }
};
VBPaneInit.prototype.initializePages = function() {
    if (this.tag_array.length === 0) {
        return;
    }
    var index, page_element;
    for (index = 0; index < this.tag_array.length; index++) {
        page_element = document.getElementById(this.tag_array[index] + '_page');
        page_element.style.display = 'none';
    }
    vDomPageFlip(this.tag_array[0]);
};

new VBPaneInit(tag_array);​
于 2012-07-01T21:38:22.923 に答える
2

new他の回答でエラーが強調されているため、それをハイジャックしませんが、キーワードが正確に何をするのか、およびその省略と包含の意味を指摘している人はいません。

だから、OPのために...

apply()JavaScript では、イベント コールバックではない関数、call()または、 またはを介し​​て呼び出される関数bind()、またはオブジェクトのメソッドである関数の場合、thisそれらの内部の のデフォルト値は window か、ECMA5 厳密モードではundefined.

これは、関数のインスタンスを作成するキーワードを使用して関数を呼び出すと変更さnewれます (これはシミュレーションですが、JavaScript には他の言語のクラスの正確な概念がないため)。これらの場合、this予想どおり、 はインスタンスを指します。

于 2012-07-01T21:48:37.027 に答える