第一个使用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.'
};
};
答案 0 :(得分:5)
没有this
,因为您没有说new VBPaneInit(tag_array)
,您需要new
来创建对象。
然后,您的下一个问题是您没有以两种不同的方式正确构建原型:
vBPaneInit
与VBPaneInit
不同,JavaScript区分大小写。你应该做更多这样的事情:
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
指向实例。