Как использовать в конструкторе метод в методе с таймаутом?

201
17 июля 2021, 18:10

Вызываю метод sayMeow() в методе voice() без таймаута. Все норм

   function catTemplate(cat) {
    this.word = 'meow',
    this.sayMeow = function(){
        console.log(this.word);
    }
    this.voice = function(){
       this.sayMeow();
    };
}
var Barsik = new catTemplate;
Barsik.voice();

С таймаутом not a function

 function catTemplate(cat) {
    this.word = 'meow',
    this.sayMeow = function(){
        console.log(this.word);
    }
    this.voice = function(){
        setTimeout(this.sayMeow , 1000)
    };
}
var Barsik = new catTemplate;
Barsik.voice();
Answer 1

Так происходит потому что теряется контекст (В данном случае this Вашего класса). Для того чтобы исправить данную проблему необходимо осуществить привязку контекста к данному методу используя bind(). Привязка контекста к функции

 function catTemplate(cat) { 
    this.word = 'meow', 
    this.sayMeow = function(){ 
        console.log(this.word); 
    } 
    this.voice = function(){ 
        setTimeout(this.sayMeow.bind(this) , 1000) 
    }; 
} 
var Barsik = new catTemplate; 
Barsik.voice();

READ ALSO
js замена слова на всей странице

js замена слова на всей странице

Можно ли как-то улучшить код и написать все более эффективно?

256
разбивка строки на массив

разбивка строки на массив

Как из такой Organization/LimitedCompany/HousingCooperative строки можно сделать массив такого вида: ['Organization', 'Organization/LimitedCompany', 'Organization/LimitedCompany/HousingCooperative']?

172
Nuxt Vuetifi, переопределение стилей scss

Nuxt Vuetifi, переопределение стилей scss

В продакшен версии мои стили перебиваются стилями vuetify

218
document.querySelectorAll() в IE8

document.querySelectorAll() в IE8

Есть возможность заставить работать documentquerySelectorAll('

252