如何正确设置这些javascript代理?

时间:2019-06-23 02:14:59

标签: javascript proxies

我正在尝试为正在制作的这款游戏的玩家和对手角色设置代理。基本上,我希望游戏在玩家/对手的生命值设置为0时打印游戏结束画面。

我尝试在其自己的变量中定义字符对象,但这没有用。现在,我的代理指向了我在游戏中代表角色的新实例。这类工作有效,因为程序现在可以识别出,当我调用proxy.method时,该方法是代理指向的对象的方法。但是,当我尝试运行代码时,运行状况栏完全不变。

// function to attack if the coolDown is false
function attack(character, move, other, coolDown) {
  if(coolDown.getValue() === false) {
    character.makeMove(move, other);
    coolDown.setValue(true);
  }
}


const HANDLER = {
  set: function(obj, prop, value) {
    console.log(`obj = ${obj} prop = ${prop} value = ${value}`);
    obj.prop = value;
    if(prop === 'health') {
      if(obj.prop.value === 0) {
        gameover(true);
      }
    }
    return true;
  }
};

var playerCoolDown = new CoolDownTime(false);
var player = new Proxy(new Character(PLAYER_HP), HANDLER);
var opponent = new Proxy(new Character(OPP_HP), HANDLER);

setInterval(() => playerCoolDown.setValue(false), 2000);
setInterval(() => opponent.makeMove('KICK', player), 2000);

player.updateHealth();
opponent.updateHealth();

// event listeners for various moves
PUNCH.addEventListener('click', () => {attack(player, 'PUNCH', opponent, playerCoolDown)});
KICK.addEventListener('click', () => {attack(player, 'KICK', opponent, playerCoolDown)});
HEAL.addEventListener('click', () => {attack(player, 'HEAL', opponent, 
playerCoolDown)});
EXTERMINATE.addEventListener('click', () => {attack(player, 'EXTERMINATE', opponent, playerCoolDown)});

我希望console.log('obj = ${obj}')打印出Character,但是它打印出[object Object]。运行console.log('${obj.prop}'}时,我不确定。但是,当我调用console.log('prop = %{prop} value = ${value}')时,我得到正确的值“健康”,并且某些值从100递减(应该是,健康从100开始)。但是,在再次调用它之后,它的新值减小了100,几乎就像每次重置健康值时代理实例化一个新的Character对象一样。 (只是观察,我不知道这是否有帮助)

0 个答案:

没有答案