【问题标题】:Can’t access object key inside object function?无法访问对象函数内的对象键?
【发布时间】:2020-10-10 18:02:28
【问题描述】:

我正在构建一个基于 Web 应用文本的 RPG 游戏。游戏将使用 textNodes 并在从问题中选择每个答案后移至下一个“问题”。

在我的游戏中,我将允许用户在游戏开始时选择特权。

其中一个好处是“润滑脂”。

这个游戏中有派系,我想检查玩家是否有加油员特权,并检查当前询问的问题是否包含派系“加油员”。

如果这两件事都是真的,我会运行相同的逻辑,但会减少伤害。如果没有,我会按照它出现的样子运行函数。

这是2个问题的代码,其中一个具有功能。

function addRadiatedStatus() {
  character.radiated = true;
}

const textNodes = [
  {
    id: 1,
    text: "Do you want to help this person?",
    options: [
      {
        text: "Yes",
        nextText: 2,
      },
      {
        text: "No",
        nextText: 2,
      },
    ],
    faction: "Greaser",
  },
  {
    id: 2,
    text: "It was a trap, do you run or kill them?",
    options: [
      {
        text: "Run",
        nextText: 3,
        damage: 0,
      },
      {
        text: "Kill",
        nextText: 5,
        damage: 8,
        moneyDrop: 20,
        radiationDamage: 2,
        function: function update() {
          if (character.greaser == true && textNodes[1].faction == "greaser") {
            console.log("greaser check worked");
          }
          console.log("upadte function worked");
          character.health -= this.damage;
          character.cash += this.moneyDrop;
          character.radiationLevel += this.radiationDamage;
          character.maxHP -= this.radiationDamage;
          if (this.radiationDamage >= 1) {
            addRadiatedStatus();
          }
          console.log("character HP" + " " + character.health);
          console.log("character maxHP" + " " + character.maxHP);
          console.log("moneyDrop " + " " + this.moneyDrop);
          console.log("character cash" + " " + character.cash);
          console.log("radiation level" + " " + character.radiationLevel);
          console.log("character Raditated?" + " " + character.radiated);
        },
      },
    ],
    faction: "Greaser",
  },
];

textNodes[1].options[1].function();

如您所见,我正在硬编码textNodes[1].faction,一旦我有数百个问题/选择,这将变得非常烦人。

我正在寻找一种方式来表达类似 `textNodes[textNodes.id].faction' 的内容,这样我就可以重用代码而无需硬编码。

我也对如何在问题选择/答案中自动调用任何函数感到困惑,因为目前,我正在对页面底部的函数调用进行硬编码,例如 textNodes[1].options[1].function()

我希望能够做两件事...

  1. 只要玩家选择了选项,就会自动调用该函数

  2. 将 textNode ID 动态添加到 if/else 检查“greaser”。

我是 javascript 新手,我不知道为什么我无法从我的函数中获取密钥“id”。

提前致谢。

【问题讨论】:

  • 好吧,只是为了简化,您无法从选项中提取该功能,对吧?它显示什么错误?
  • 好吧,首先这对我来说是一个危险信号;每当您在数组中有一个对象时,最好为该对象定义一个类型,尝试获取其中一个对象中可能不存在的属性会让您头疼
  • @D1ZZYD23 没有我遇到的问题是指这个 if / else ... if(character.greaser == true && textNodes[1].faction == "greaser"){ console.log("greaser check worked"); } ,问题是,我必须硬编码 textNodes[1].faction,但我想动态添加 ID这个问题,这样我就不必硬编码了。我尝试了一些类似textNodes[this.id].faction 的方法,但似乎无法正常工作。
  • @D1ZZYD23 另一个问题是,我现在正在对函数调用进行硬编码,但如果在游戏中选择了该文本节点,我希望函数自动运行(并且仅运行)。重点是每个问题选项都会附加一个函数,在游戏中选择该函数应该会自动调用该函数。我不确定这是否可能。
  • @ETHan 看看我更新的答案

标签: javascript object javascript-objects


【解决方案1】:

更改您的回调函数声明。您正在使用:

function: function update(){

并称它为你使用:

textNodes[1].options[1].function();

你可以这样写:

update: () => { 

然后这样称呼它:

textNodes[1].options[1].update();

此外,如果您不想硬编码任何内容,您可以更改字符对象,而不是布尔值character.greaser,您可以创建字符串character.faction,其值为greaser,那么您可以简单地做到这一点

if (character.faction == this.faction) {
      console.log("greaser check worked");
}

您也可以尝试将id 作为update() 函数的参数传递。

update: (id) => { // pass id in update function

if (character.faction == textNodes[id].faction) { // check is done
      console.log("greaser check worked");
}

textNodes[1].options[1].update(1); //  this could help in case you want to also check values of other textNodes

【讨论】:

  • 好的,我会试试这个,看看如何/如果它有效......但我仍然有调用函数的问题。我不想对函数调用进行硬编码,因为我只应在选择“选择”/文本节点选项时调用该函数。有没有办法让函数在对象被调用后自动运行?
  • @ETHan 检查更新,也许通过update() 函数参数中的id 为您提供更好的服务。
【解决方案2】:

添加另一个函数来查找所需的文本节点。然后将该 textNode 的函数调用为

function findTextNode(){
   if(character.greaser == true){
   var textNode=textNodes.filter(textNode => textNode.faction === "Greaser") 
   if(textNode){ 
     return textNode
   }
   return null;
}
var textNode=findTextNode();
if(textNode && textNode.update){// if textNode not null and have update function 
  textNode.update();
}

//Then update function will be as

update: function update(){
... function body goes here ...
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 2019-10-06
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多