2016-03-31 5 views
1

Also sagen wir, ich habe eine Kachel auf einer Karte.Machen Sie eine Variable die Methoden eines vorhandenen Prototyps erben?

function TileData (image, z) { 
    this.image = image; 
    this.z = z; 
} 
var tile = new TileData (tileimage, 0); 

Jetzt kann ich tile.image und tile.z aufrufen, um die vorhandenen Daten zu referenzieren.

Ich habe auch ein Array namens map, die ich durchschleifen kann, um die Karte zu zeichnen.

var map = []; 

Was ich tun möchte, ist die Methoden der vorhandenen Fliesen in der Anordnung auf den 0-ten Eintrag zu befestigen, so wird es gezogen werden, wenn die Funktion aufgerufen wird.

Also habe ich versucht, so etwas zu tun.

So kann ich map [0] .image aufrufen, um das Bild zu erhalten, das diese Kachel auf der Karte darstellt.

Jetzt möchte ich das Bild dieser Fliese ändern, also versuche ich dies zu tun.

map[0].image = differentTileImage; 

aber eigentlich, was Javascript tut, ist dies:

tile.image = differentTileImage; 

die jederzeit bedeutet, dass ich versuchen, diese Kachel für einen anderen Teil der Karte zu verwenden, wird es einen anderen Wert haben.

map[1] = tile; 
//map[1].image will return differentTileImage instead of tileimage. 

Gibt es eine Möglichkeit für eine Variable, die Eigenschaften und Werte eines vorhandenen Prototyps zu erben, statt nur darauf Bezug zu nehmen?

(Sorry, wenn dies ein Betrogener ist).

+2

Die triviale Lösung scheint hier zu sein: map [0] = new TileData (differentTileImage, map [0] .z) ', obwohl ich sehen konnte, dass der' TileData' -Konstruktor komplexer wird. – apsillers

Antwort

0

Das Problem, dass Objekte in JavaScript ist durch Bezugnahme immer weitergegeben. Wenn Sie das Original ändern, werden alle Werte in der Kette geändert, in der Sie diese Referenz verwenden.

In Ihrem Fall tile und map[0] sind die gleichen denken. Wenn Sie die Kachel ändern, wird map[0] geändert, weil die Referenz im Speicher dieselbe ist wie tile.

0

Wenn ich versuche, diese Kachel für einen anderen Teil der Karte zu verwenden, hat sie einen anderen Wert.

Nun, nicht genau. Das heißt, wenn Sie für jeden Teil der Karte eine einzelne Kachel verwenden, hat sie überall den exakt gleichen Wert. Und wenn Sie diese einzelne Kachel ändern, ändert sich die gesamte Karte.

Was Sie wollen, ist mehrere Kachel Instanzen zu erstellen:

map[0] = new TileData (tileimage, 0); 
map[1] = new TileData (tileimage, 0); 
… 

(Sie eine Schleife natürlich verwenden würde)

Sie werden immer noch alle aus dem gleichen Prototyp-Objekt erben (TileData.prototype), aber sind unterschiedliche Instanzen und jedes Bild kann separat geändert werden.

Verwandte Themen