这在我的函数* t中没有定义

时间:2012-07-01 21:27:30

标签: javascript

第一个使用this(第2行)错误的语句:

this is undefined

验证了行号。验证了这种使用方式适用于另一个名为SMessage的函数。尝试更改参数名称,使其不等于object属性。无法弄清楚为什么它不会对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.'
    };
};

2 个答案:

答案 0 :(得分:5)

没有this,因为您没有说new VBPaneInit(tag_array),您需要new来创建对象。

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

  1. vBPaneInitVBPaneInit不同,JavaScript区分大小写。
  2. 您正在尝试在构造函数中设置原型,因此在您第一次创建对象时它不会存在,并且您每次创建对象时都会这样做。
  3. 你应该做更多这样的事情:

    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);​
    

答案 1 :(得分:2)

其他答案突出了错误,所以我不会劫持,但是没有人指出new关键字的确切含义以及对其遗漏和包含的影响。

所以,为了OP ...

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

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