【问题标题】:Logic inside a basic class method not behaving as expected基本类方法中的逻辑未按预期运行
【发布时间】:2021-08-02 16:54:57
【问题描述】:

为了更好地理解它们而玩弄类,我发现自己陷入了原本应该非常基本的东西。

下面的代码基本上只是一个扩展另一个类的类,我尝试了它们。 我的问题与 Animal 方法 danger(dangerLvl) 中的逻辑有关。

下面的写法按预期工作:

class Animal {
    constructor(name, age, dangerLvl) {
        this.name = name;
        this.age = age;
        this.dangerLvl = dangerLvl;
    }
    danger(dangerLvl) {
        if (dangerLvl != 0) {
            return `${this.name} is dangerous!`
        } else {
            return `${this.name} is docile :)`
        }
    }
}

class Feline extends Animal {
    hiss() {
        return `${this.name} hisses threateningly!`
    }
}

const sissi = new Feline("Sissi", 5, 1);

sissi.danger();
// returns "Sissi is dangerous!"

我不明白的是方法danger(dangerLvl) 在这样写时的行为:

    danger(dangerLvl) {
        if (dangerLvl >= 1) {
            return `${this.name} is dangerous!`
        } else {
            return `${this.name} is docile :)`
        }
    }

const sissi = new Feline("Sissi", 5, 1);

sissi.danger();
// returns "Sissi is docile :)" <===== which is NOT expected. This is what I don't get.

不完全确定我是如何设法达到某种程度的,即我在某种程度上获得了异步函数、回调和原型,但无法弄清楚像这样基本的东西。至少可以说相当令人沮丧。

在我看来,我什至应该可以这样写,但显然我错过了一些东西......

    danger(dangerLvl) {
        if (dangerLvl >= 1) {
            return `${this.name} is dangerous!`
        }
        return `${this.name} is docile :)`
    }

谢谢。

【问题讨论】:

  • 在比较发生之前尝试打印 dangerLvl。
  • dangerLvl 未定义。动物永远是危险的
  • 你没有通过参数......并且undefined &gt;= 1 评估为假。该函数实际上根本不应该接受参数,并且您应该使用具有相同名称的成员。
  • // 返回“茜茜公主很危险!”,// 返回“茜茜公主很温顺 :)” 您自己的打印语句不匹配。由于从参数中使用了 dangerLvl,因此它始终是未定义的。尝试改用this.dangerLvl
  • 谢谢大家,这些基本错误让我失望地摇头*。感谢手把手的人。

标签: javascript function class oop if-statement


【解决方案1】:

由于您没有将dangerLvl 作为参数传递,因此它是未定义的。如果你想访问dangerLvl 类成员,你需要使用this。这是一个例子

class Animal {
    constructor(name, age, dangerLvl) {
        this.name = name;
        this.age = age;
        this.dangerLvl = dangerLvl;
    }
    danger() {
        if (this.dangerLvl != 0) {
            return `${this.name} is dangerous!`
        } else {
            return `${this.name} is docile :)`
        }
    }
}

【讨论】:

    【解决方案2】:

    我完全不明白你为什么使用 dangerLvl 作为 Animal.prototype.danger 函数的参数,如果你在那个上下文中有它,如果你不这样做' t 定义它将被传递为未定义的参数,并且条件得到 else 因为undefined &gt;= 1 为假。

    class Animal {
        constructor(name, age, dangerLvl) {
            this.name = name;
            this.age = age;
            this.dangerLvl = dangerLvl;
        }
        danger(){
            
            console.log(this.dangerLvl);
        
            if (this.dangerLvl >= 1) {
                return `${this.name} is dangerous!`
            } else {
                return `${this.name} is docile :)`
            }
        }
    }
    
    class Feline extends Animal {
        
        hiss() {
            return `${this.name} hisses threateningly!`
        }
    }
    
    const sissi = new Feline("Sissi", 5, 1);
    
    console.log(sissi.danger()); //Sissi is dangerous
    
    
    const sissi2 = new Feline("Rabbit", 5, undefined);
    
    console.log(sissi2.danger()); //Rabbit is docile :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      相关资源
      最近更新 更多