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创建一个对象。

然后,您的下一个问题是您没有以两种不同的方式正确构建原型:

  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...

在 JavaScript 中,对于不是事件回调或通过apply(), call()or调用的函数bind(),或者是对象的方法,this它们内部的默认值是 window 或者在 ECMA5 严格模式下,undefined

如果您使用new关键字调用函数,这会改变,这会创建函数的实例(因为 JavaScript 没有与其他语言一样的类的确切概念,尽管这是一种模拟)。在这些情况下this,正如人们所期望的那样,指向实例。

于 2012-07-01T21:48:37.027 回答