2011-01-03 10 views
4

definiert ich eine Klasse wie folgt zunächst:Definieren von Javascript-Klasse Prototyp Methoden

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';} 
}; 

, die eine Ausnahme auslöst, wenn ich versuche, ein Objekt zu erstellen:

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

in Chrom und nicht still in Firefox (mit Firebug)

Dies funktioniert OK aber:

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

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

Was ist der richtige Weg, um prototypische Methoden im Körper zu implementieren?

Antwort

9

Was ist der richtige Weg, um prototypische Methoden im Körper zu implementieren?

Sie können gerne diese Antwort nicht: nicht definieren sie im Inneren des Körpers, denn das würde sie jedes Mal neu definieren der Konstruktor für das Objekt ausgeführt wird. Definieren Sie sie wie Sie arbeiten, mit objectType.prototype..., nachdem es erklärt wird.

Prototype Methoden gibt es speziell unter allen Instanzen gemeinsam genutzt werden, ist irgendwo, was Sie tun in-zwischen, Sie entweder wollen, dass sie zu dieser Instanz innerhalb spezifischer erklärt, wie folgt aus:

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';} 
} 

oder geteilt auf dem Prototyp außen, wie folgt:

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';} 
+0

Nun, ich mochte es nicht viel, aber Sie haben einen Punkt. –

Verwandte Themen