首页 > 解决方案 > 如何正确设置这些 javascript 代理?

问题描述

我正在尝试为我正在制作的这款游戏的玩家和对手角色设置代理。基本上我希望游戏在玩家/对手的健康设置为 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 对象一样。(只是一个观察,我不知道这是否有帮助)

标签: javascriptproxies

解决方案


推荐阅读