Почему метод экземпляра класса приводит к неопределенности после вызова.Функция тайм-аута правильная? - PullRequest
1 голос
/ 20 сентября 2019

aeri.attack / aeri.magicAttack приводит к функции attack ().Но если я попытаюсь вызвать функцию, это приведет к неопределенности.ПОЧЕМУ.

Я попытался создать экземпляр Character, чтобы увидеть, был ли это только подкласс, но это не так.

PS Если бы кто-нибудь сказал мне, правильно ли я выполняю функцию setTimeout, это было бы здорово, и я бы любил тебя вечно.

PS PS Я не могу проверить, работает ли метод тайм-аута, потому что ни один из моих методов не работает.

class Character {
    constructor(name, weapon) {
        this.name = name;
        this.weapon = weapon;
    }

    attack(){
        this.name + ' attacks with ' + this.weapon;
    }
}

class Elf extends Character {
    constructor(name, weapon, type) {
        super(name, weapon);
        this.type = type;
    }

    magicAttack() {
        this.name + ' chants ';
        setTimeout(function(){this.type; }, 3000);


    }
}

const aeri = new Elf("Aeri", "bow", "air")
const bob = new Character("Bob", "yawn")

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Есть несколько причин, по которым код из исходного поста не делает то, что ожидает от ОП.

class Character {
    constructor(name, weapon) {
        this.name = name;
        this.weapon = weapon;
    }

    attack(){
        this.name + ' attacks with ' + this.weapon;  //  (1)
    }
}

class Elf extends Character {
    constructor(name, weapon, type) {
        super(name, weapon);
        this.type = type;
    }

    magicAttack() {
        this.name + ' chants ';                      //  (2)
        setTimeout(function(){this.type; }, 3000);   //  (3)


    }
}

const aeri = new Elf("Aeri", "bow", "air")
const bob = new Character("Bob", "yawn")

(1) В методе attack() отсутствует return оператор

(2) Оператор this.name + ' chants '; ничего не делает, поскольку результат объединения не присваивается переменной или не передается методу, поэтому он просто отбрасывается.

(3) Анонимная функция, переданная setTimeout, ссылается this.type, но учитывая , как this работает в JavaScript , type не определена в этом контексте (поскольку this на самом деле является анонимной функциейсам).

Чтобы увидеть результаты вызова метода, необходимо применить следующие изменения к исходному образцу кода:

class Character {
    constructor(name, weapon) {
        this.name = name;
        this.weapon = weapon;
    }

    attack(){
        return this.name + ' attacks with ' + this.weapon;    //  (1)
    }
}

class Elf extends Character {
    constructor(name, weapon, type) {
        super(name, weapon);
        this.type = type;
    }

    magicAttack() {
        const chant = this.name + ' chants ';                  //  (2)
        setTimeout(function(){ console.log(chant); }, 3000);   //  (3)

    }
}

const aeri = new Elf("Aeri", "bow", "air")
const bob = new Character("Bob", "yawn")

aeri.magickAttack();

Надеюсь, это поможет!

Jan

1 голос
/ 20 сентября 2019

просто добавьте console.log в ваш код:

class Character {
    constructor(name, weapon) {
        this.name = name;
        this.weapon = weapon;
    }

    attack(){
       console.log(this.name +' attacks with ' +this.weapon);
    }
}

class Elf extends Character {
    constructor(name, weapon, type) {
        super(name, weapon);
        this.type = type;
    }

    magicAttack() {
        console.log(this.name + ' chants ');
        setTimeout(()=>{
           console.log(this.type); 
        }, 3000);
    }
}

const aeri = new Elf("Aeri", "bow", "air")
const bob = new Character("Bob", "yawn")


bob.attack()
aeri.magicAttack()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...