Определение методов-прототипов классов Javascript - PullRequest
4 голосов
/ 03 января 2011

Сначала я определил такой класс:

function mapTile(nx,ny)
{
    //members
    this.x = nx;
    this.y = ny;

    //methods
    this.prototype.visible = function(){return true;};
    this.prototype.getID = function(){return y*tiles_per_line+x;};
    this.prototype.getSrc = function(){return 'w-'+this.getID+'.png';}
};

, который выдает исключение, когда я пытаюсь создать объект:

t=new mapTile(1,1)
TypeError: Cannot set property 'visible' of undefined

в Chromium, и в Firefox происходит сбой (с firebug)

Это работает нормально, хотя:

function mapTile(nx,ny)
{
    //members
    this.x = nx;
    this.y = ny;
};

//methods
//this.prototype.xx=1;
mapTile.prototype.visible = function(){return true;};

Как правильно реализовать методы-прототипы внутри тела?

1 Ответ

9 голосов
/ 03 января 2011

Как правильно реализовать методы-прототипы внутри тела?

Вам может не понравиться этот ответ: не определяйте их внутри тела, поскольку это будет переопределять их каждый раз, когда конструктор запускается для этого объекта. Определите их так, как будто вы работаете, с objectType.prototype... после того, как оно объявлено.

Методы прототипа предназначены для общего использования всеми экземплярами, то, что вы делаете, находится где-то посередине, вы либо хотите, чтобы они были объявлены внутри, специфичными для этого экземпляра, например:

function mapTile(nx,ny)
{
    //members
    this.x = nx;
    this.y = ny;

    //methods
    this.visible = function(){return true;};
    this.getID = function(){return y*tiles_per_line+x;};
    this.getSrc = function(){return 'w-'+this.getID+'.png';}
}

Или поделился с прототипом снаружи, как это:

function mapTile(nx,ny)
{
    //members
    this.x = nx;
    this.y = ny;
}
mapTile.prototype.visible = function(){return true;};
mapTile.prototype.getID = function(){return y*tiles_per_line+x;};
mapTile.prototype.getSrc = function(){return 'w-'+this.getID+'.png';}
...