使用javascript对象的未定义错误

时间:2011-07-01 13:08:02

标签: javascript dom inner-classes javascript-objects

我是javascript对象的新手,我有一个问题。我正在尝试制作一个图片库,但我一直收到一个错误,即.current,this.size& this.initial是未定义的,因此脚本无法工作。请帮我解决这个错误。以下是完整的脚本。

function gallery()
{
    this.image = new Array(10);
    this.initial = 1;   
    this.current = 0;
    this.size = 10;
    this.frame_height = 400;
    this.frame_width = 600;
    this.initialize=function()
    {
        if(document.images)
        {
            var count = 1;
            for(count=1;count<=this.size;count++)
            {
               this.image[count] = new Image();
               this.image[count].src = 'images/'+count+'.jpg';                 
            }
        }

    divImg.id = "divImg";   
    divImg.setAttribute("Width",this.frame_width);
    divImg.setAttribute("align","center");   
    divImg.setAttribute("margin","0px auto"); 


    divBtn.id = "divBtn";    
    divBtn.setAttribute("align","center");  
    divBtn.setAttribute("backgroung-color","Black"); 
    divBtn.setAttribute("color","White"); 
    divBtn.style.margin = "0px auto";   
    divBtn.className ="btn";

    pictureFrame.src = this.image[this.initial].src;
    pictureFrame.setAttribute('Width',this.frame_width);
    pictureFrame.setAttribute('Height',this.frame_height);
    pictureFrame.name = 'img';

    btnNext.innerHTML='NEXT';
    btnPrevious.innerHTML='PREVIOUS';
    btnLast.innerHTML='LAST';
    btnFirst.innerHTML='FIRST';

    btnFirst.onclick=this.first;
    btnLast.onclick=this.last;
    btnPrevious.onclick=this.previous;
    btnNext.onclick=this.next;  

    myForm.appendChild(pictureFrame);
    divImg.appendChild(myForm);

    divBtn.appendChild(btnFirst);
    divBtn.appendChild(btnPrevious);
    divBtn.appendChild(btnNext);
    divBtn.appendChild(btnLast);

    pageBody.appendChild(divImg);
    pageBody.appendChild(divBtn);
    headerTag.appendChild(pageBody);
}

this.next=function()
{
    alert(this.size);
    alert(this.current);
    if (this.current < this.size) 
    {
        this.current +=1;
        pictureFrame.src = this.image[this.current].src;
    }
    else
    {
        alert("This is the last image");
    }
}   
this.previous=function()
{
    alert(this.current);
    alert(this.initial);
    if (this.current > this.initial) 
    {
        this.current = this.current-1;
        pictureFrame.src = this.image[this.current].src;
    }
    else 
    {
        alert("This is the first image");
    }

}
this.first=function()
{
    this.current=this.initial;
    pictureFrame.src = this.image[this.current].src;
}
this.last=function()
{
    alert(this.size);
    this.current=this.size;
    pictureFrame.src = this.image[this.current].src;
}

};

var divImg= document.createElement('div');
var divBtn = document.createElement('div');
var btnFirst= document.createElement('button');
var btnNext= document.createElement('button');
var btnPrevious= document.createElement('button');
var btnLast= document.createElement('button');
var divTop = document.createElement('div');
var headerTag = document.getElementsByTagName('html')[0];
var pageBody = document.createElement('body');
var myForm=document.createElement("form");
var pictureFrame = document.createElement('img');


var pics=new gallery();
window.onload=pics.initialize();

2 个答案:

答案 0 :(得分:1)

您正在使超出范围失败,这对于不熟悉ECMAscript的人来说非常常见。

每个函数都有自己的执行上下文,ECMA- / Javascript中的每个上下文都有自己的this上下文变量。为了避免这种情况,最常见的方法是在局部变量中存储对“外部”this上下文变量的引用:

function gallery()
{
    this.image = new Array(10);
    this.initial = 1;   
    this.current = 0;
    this.size = 10;
    this.frame_height = 400;
    this.frame_width = 600;

    var self = this;

    //...

    this.initialize=function()
    {
        if(document.images)
        {
            var count = 1;
            for(count=1;count<=self.size;count++)
            {
               self.image[count] = new Image();
               self.image[count].src = 'images/'+count+'.jpg';                 
            }
        }
    // ...

这将适用于每个Javascript环境。与此同时,在ECMA中有“更好”(其他)方法来避免这个问题。例如,ECMAscript Edition 5引入了.bind()方法,它允许您将this context variable的引用“绑定”到您选择的对象。许多javascript框架提供了一种非常类似的方法将this绑定到一个对象,甚至Javascript本身也可以让你轻松地完成它。

答案 1 :(得分:1)

jAndy说的是正确的,当window对象调用pics.initialise时,this引用windowthis指的是函数的调用者,除非该函数是匿名的。)

但是,您可能更喜欢更简单的解决方案:

而不是

var pics = new gallery();
window.onload = pics.initialize;

你可以这样做:

var pics = new gallery();
window.onload = function() {
    pics.initialize();
};

因为它包含在匿名函数中,this将引用gallery实例,而不是window

jAndy的建议肯定更强大,但对于仍在使用Javascript的人来说可能有点困难。