【问题标题】:Reads object inside object as undefined将对象内的对象读取为未定义
【发布时间】:2018-06-17 23:49:46
【问题描述】:

我正在尝试制作一款口袋妖怪风格的游戏,您可以在其中孵化和进化龙。大多数龙都进化成更强大的龙。

https://jsbin.com/pulawoz/15/edit?html,js,output

当我创建“evolve”函数时,我遇到了麻烦。它总是将正在进化的龙 (dragonToEvolve) 的 evolutionsInto 属性读取为未定义。

你可以在这里看到问题代码:

var dragons = [];
var enemyDragon;

function Dragon(name, ATK, maxATK, HP, maxHP, normalPowers, continuousPowers,
    responsePowers, type, cry, evolvesInto, numberOfAttacks) {

    this.name = name;
    this.ATK = ATK;
    this.HP = HP;
    this.maxATK = maxATK;
    this.maxHP = maxHP;
    this.normalPowers = normalPowers;
    this.continuousPowers = continuousPowers;
    this.responsePowers = responsePowers;     
    this.type = type;        
    this.cry = cry;        
    this.evolvesInto = evolvesInto;        
    this.numberOfAttacks = numberOfAttacks        
}

// Dragons

var lusterDragon = new Dragon("Luster Dragon", 1900, 1900, 2500, 2500, [],
   [], [], "Wind", "Shining Emerald Blast! Sha-shing!", lusterDragon2, 1);

var lusterDragon2 = new Dragon("Luster Dragon 2", 2400, 2400, 3100, 3100, [], 
    [], [], "Wind", "Ultimate Emerald Blast! Shaka-shing!", null, 1);

var wattailDragon = new Dragon("Wattail Dragon", 2500, 2500, 3000, 3000, [], 
    [], [], "Light", "Shock Bolt! KRAKA-THOOM!", null, 1);

var babyDragon = new Dragon("Baby Dragon", 1200, 1200, 1800, 1800, [], [], 
    [], "Wind", "Mini Fang! Chomp!", thousandDragon, 1);

var thousandDragon = new Dragon("Thousand Dragon", 2400, 2400, 3500, 3500, 
    [], [], [], "Wind", "Thousand Fang! Chomp!", null, 1);

var alexandriteDragon = new Dragon("Alexandrite Dragon", 2000, 2000, 2400, 
    2400, [], [], [], "Light", "Diamond Blast! Sha-shing!", null, 1);

var hyozanryu = new Dragon("Hyozanryu", 2100, 2100, 3800, 3800, [], [], [], 
    "Light", "Diamond Blade! Shing!", lightEndDragon, 1);

var labradoriteDragon = new Dragon("Labradorite Dragon", 0, 0, 4500, 4500, 
    [], [], [], "Dark", "...", darkEndDragon, 1);

var darkEndDragon = new Dragon("Dark End Dragon", 2600, 2600, 4000, 4000, 
    [darkDrain], [], [], "Dark", "Infernal Force! OOOOOOOOOM!", null, 1);

var lightEndDragon = new Dragon("Light End Dragon", 2600, 2600, 4000, 
    4000[lightBlast], [], [], "Light", "Shining Force! OOOOOOOOM!", null, 1)

var cyberDragon = new Dragon("Cyber Dragon", 2100, 2100, 2700, 2700, [], [], 
    [], "Light", "Cyber Burst! FWOOOOM!", cyberTwinDragon, 1);

var cyberTwinDragon = new Dragon("Cyber Twin Dragon", 2800, 2800, 3600, 3600, 
    [], [], [], "Light", "Cyber Burst v2! FWOOOOM!", cyberEndDragon, 2);

var cyberEndDragon = new Dragon("Cyber End Dragon", 4000, 4000, 5000, 5000, 
    [cyberPierce], [], [], "Light", "Ultimate Cyber Burst! FWOOOOOOOOOOOOOOOOOOOOM!", 
    null, 1)

var cyberDragonDrei = new Dragon("Cyber Dragon Drei", 1800, 1800, 2600, 2600, 
    [], [], [], "Light", "Cyber Burst! FWOOM!", cyberDragonNova, 1);

var cyberDragonNova = new Dragon("Cyber Dragon Nova", 2100, 2100, 3000, 3000, 
    [cyberUpgrade], [], [], "Light", "Helios Cyber Burst! FWOOOM!",
    cyberDragonInfinity, 1);

var cyberDragonInfinity = new Dragon("Cyber Dragon Infinity", 2100, 2100, 
    3000, 3000, [cyberAbsorb], [cyberGain], [cyberCancel], "Light", 
    "Infinite Cyber Burst! FWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOM!", 
    null, 1);

var evolveAsk = function(){
    var selectedDragon = prompt("Which dragon do you want to evolve?");
    var dragonToEvolve = selectedDragons[selectedDragon-1];

    console.log(dragonToEvolve.name + " selected.");

    dragons.shift(dragonToEvolve);

    console.log(dragonToEvolve);

    dragons.push(dragonToEvolve.evolvesInto);            
};

var evolvePrint = function(){
    console.log(selectedDragons);          
    var i = 0;

    for (i = 0; i < dragons.length; i++) { 
        if(dragons[i].evolvesInto !== null){
            console.log("Press " + (i+1) + " to select " + dragons[i].name);
            selectedDragons.push(dragons[i]);
        }
    }          
};

var selectedDragons = [];

var evolve = function(){          
    selectedDragons = [];
    evolvePrint();

    setTimeout(function(){
        evolveAsk();
    },1000);
}

我是个菜鸟,所以我可能缺少一些明显的东西。非常感谢任何帮助!

附: 如果要对其进行测试,请输入以下命令:

dragons.push(lusterDragon);
evolve();

然后按1回车。

【问题讨论】:

  • 如果你在解析进化函数后查看dragons数组,它会显示“未定义”作为一个值。
  • 好吧,在这种情况下你只需要在lusterDragon之前声明lusterDragon2
  • 你会怎么做呢?我是菜鸟。
  • 阅读ericlippert.com/2014/03/05/how-to-debug-small-programs 了解如何调试程序的技巧

标签: javascript class object undefined


【解决方案1】:

您的 evolvesInto 属性中存在一些混淆。对于lusterDragon,它是一个数组,对于其他龙,它是一个变量。

我们需要保持一致。将所有变量转换为字符串的最简单解决方案:

var lusterDragon = new Dragon("Luster Dragon", 1900, 1900, 2500, 2500, [], [], [], "Wind", "Shining Emerald Blast! Sha-shing!", 'lusterDragon2', 1);

如果您想将其保留为嵌套对象(我认为您想要),您需要先定义 lusterDragon2,此处为 Fiddle 示例:https://jsbin.com/nevaqicaro/1/edit

就像现在一样,由于变量 lusterDragon2 尚未定义,它将是未定义的。

【讨论】:

  • 当然,如果它适合你,请接受这个答案。
【解决方案2】:

使用@Joseph Cho 所说的字符串绝对是一种方法,然后您可以拥有一个选择可进化类型的处理程序,或者您可以从另一个类扩展该类。

@Rudolf Manusachi 在说什么,我认为第一个问题是您的进化类型没有在您的未进化类型之前定义,因此无法传递到您的对象构造函数中

检查它-> example jsbin

// Dragons
// luster 2 is now first ->
// to not have undefined they need to be defined before you may use them
// should probly happen with all evolvable dragon types 
var lusterDragon2 = new Dragon("Luster Dragon 2", 2400, 2400, 3100, 3100, [], [], [], "Wind", "Ultimate Emerald Blast! Shaka-shing!", null, 1);
var lightEndDragon = new Dragon("Light End Dragon", 2600, 2600, 4000, 4000, [lightBlast], [], [], "Light", "Shining Force! OOOOOOOOM!", null, 1);
var thousandDragon = new Dragon("Thousand Dragon", 2400, 2400, 3500, 3500, [], [], [], "Wind", "Thousand Fang! Chomp!", null, 1);

var lusterDragon = new Dragon("Luster Dragon", 1900, 1900, 2500, 2500, [], [], [], "Wind", "Shining Emerald Blast! Sha-shing!", [lusterDragon2], 1);

这是一个完美的对象继承用例,或者如果你感觉到它,es6 类和扩展,它们是一回事:Obj Constructors/ Inheritance

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2021-04-30
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多