为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript 中的嵌套对象范围和动态引用

JavaScript 中的嵌套对象范围和动态引用

猛跑小猪 2022-08-27 09:49:52
我最近一直在使用vanilla javascript来帮助自己学习这门语言,我有点难以确切地理解对象“内部变量”是如何定义的,以及其他函数可以看到什么。举个例子,假设我们有一个 gameData 变量:let gameData = {    resourcesArray: [wood, stone]}用“木头”和“石头”来定义:let wood = {    name: 'Wood',    amount: '0,}let stone = {    name: 'Stone',    amount: 0,}作为对这些变量范围的测试,假设在这种情况下,有一个“农场”建筑被定义为这样。let farm = {    name: "Farm"    amount: 0,    cost: {        'Wood': 10,        'Stone': 5,    },}那么,我如何能够按照 buyBuilding(building) 的思路创建一个函数,将其传递给服务器场对象,并使其将“农场”成本的名称与存储在 resourcesArray 中的资源正确匹配并扣除成本?理想情况下,这个函数将能够处理将来添加许多不同资源和成本的“建筑物”,这就是为什么我正在寻找一种智能方法来做到这一点,而不仅仅是为每个将要添加的“建筑物”硬编码购买功能。提前致谢!
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

对于每项费用,您必须从全局 gameData 上下文中扣除该金额...像这样:


const wood = {

  name: 'Wood',

  amount: 500, // Start out with enough to build stuff

}


const stone = {

  name: 'Stone',

  amount: 300, // Start out with enough to build stuff

}


const gameData = {

  resourcesArray: [wood, stone],

}


const farm = {

  name: "Farm",

  amount: 0,

  cost: {

    'Wood': 10,

    'Stone': 5,

  },

}


function buyBuilding(thing = farm) {

  console.log(`Time to build a ${thing.name}!`);


  Object.keys(thing.cost).forEach(resource => {

    const amount = thing.cost[resource];

    console.log(`* This requires ${amount} ${resource}...`);

    const gameResource = gameData.resourcesArray.find(r => r.name === resource);

    console.log(`  | You have ${gameResource.amount} ${resource} available.`);

    // @TODO Check if you have enough before deducting

    gameResource.amount -= amount;

    console.log(`  | Only ${gameResource.amount} ${resource} left now.`);

  });


  console.log(`New game state:`, gameData.resourcesArray);

}


// Do the actual building!

buyBuilding(farm);


查看完整回答
反对 回复 2022-08-27
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信