我正在使用特定的游戏制作框架,但我认为该问题适用于javascript

我试图制作一个旁白脚本,以便玩家可以看到“兽人击中了你”。在屏幕底部。我想一次显示最后4条消息,并且如果需要,可以允许玩家回头查看日志中的30-50条消息。为此,我设置了object和一个将对象推入的数组。

所以我最初设置了一些像这样的变量...

servermessage: {"color1":"yellow", "color2":"white", "message1":"", "message2":""},
servermessagelist: new Array(),

当我通过操作servermessage.color1 ... .message1等对事件调用的不同数据多次使用此命令(以下)时...
servermessagelist.push(servermessage)

它会用该数据的副本覆盖整个数组……任何想法为何或我能对此做些什么。

因此,如果我按下color1“RED”和message1“Rover” ..数据是正确的,那么如果我按下
color1“yellow”和message1“Bus”数据是.color1:“yellow” .message1:“Bus”的两个副本

最佳答案

当您将servermessage推入servermessagelist时,您实际上(或多或少)推了对该对象的引用。因此,对servermessage所做的任何更改都会在您引用它的任何地方反射(reflect)出来。听起来您想要执行的操作是将对象的副本推送到列表中。

声明一个函数,如下所示:

function cloneMessage(servermessage) {
    var clone ={};
    for( var key in servermessage ){
        if(servermessage.hasOwnProperty(key)) //ensure not adding inherited props
            clone[key]=servermessage[key];
    }
    return clone;
}

然后,每次要将消息推送到列表中时,请执行以下操作:
servermessagelist.push( cloneMessage(servermessage) );

07-24 16:07