所以,让我说我在地图上有一块瓷砖。
function TileData (image, z) {
this.image = image;
this.z = z;
}
var tile = new TileData (tileimage, 0);
现在我可以调用tile.image和tile.z来引用现有数据。
我还有一个名为map的数组,我可以循环绘制地图。
var map = [];
我想要做的是将现有图块的方法附加到数组中的第0个条目,以便在调用函数时绘制它。
所以我尝试做这样的事情。
map[0] = tile;
所以我可以调用map [0] .image来获取在地图上代表该图块的图像。
现在我想更改此图块的图像,所以我尝试这样做。
map[0].image = differentTileImage;
然而Javascript实际上做的是:
tile.image = differentTileImage;
这意味着每当我尝试将该图块用于地图的另一部分时,它将具有不同的值。
map[1] = tile;
//map[1].image will return differentTileImage instead of tileimage.
变量是否有办法继承现有原型的属性和值,而不仅仅是引用它?
(对不起,如果这是一个骗局)。
答案 0 :(得分:0)
是的,您可以使用Object.assign()
,该功能将创建Tile的副本。
map[1] = Object.assign({}, tile);
您可以在以下网址找到更多有用的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
答案 1 :(得分:0)
问题是JavaScript中的对象总是通过引用传递。更改原始文件时,请更改链中的所有值,使用此引用。
在您的情况下tile
和map[0]
是相同的想法。如果更改切片map[0]
已更改,因为内存中的引用与tile
相同。
答案 2 :(得分:0)
这意味着每当我尝试将该图块用于地图的另一部分时,它将具有不同的值。
不完全是这样。这意味着当您对地图的每个部分使用单个图块时,它将在任何位置具有完全相同的值。如果您更改此单个图块,整个地图将会更改。
您想要的是创建多个图块实例:
map[0] = new TileData (tileimage, 0);
map[1] = new TileData (tileimage, 0);
…
(你当然会使用循环)
它们仍然会从相同的原型对象(TileData.prototype
)继承,但它们是不同的实例,每个图像都可以单独更改。