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

我最近一直在使用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 中的资源正确匹配并扣除成本?


理想情况下,这个函数将能够处理将来添加许多不同资源和成本的“建筑物”,这就是为什么我正在寻找一种智能方法来做到这一点,而不仅仅是为每个将要添加的“建筑物”硬编码购买功能。


提前致谢!


猛跑小猪
浏览 82回答 1
1回答

动漫人物

对于每项费用,您必须从全局 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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript