По поводу Вашего вопроса Вам уже подсказали, дело в неверном связывании. Позволю себе ремарку. Ваш код, это яркий пример того, как
не следует писать/проектировать. Вместо того, чтобы обобщить поведение, Вы размазали его по экземплярам, безо всякой на то надобности. В результате, элементарный, по сути код:
Machine=function(){}
Machine.prototype.enable=function(){this.enabled=true}
Machine.prototype.disable=function(){this.enabled=false}
CoffeeMachine=function(){}
CoffeeMachine.prototype=Object.create(Machine.prototype)
CoffeeMachine.prototype.onReady=function(){
if(this.enabled) return console.log("ready")
console.log(
"error, I am stupid: if I didn't switch coffemachine's power on, how it could runs the timer? It's really amasing shit!!!"
)
}
CoffeeMachine.prototype.run=function(){console.log(this.enabled); setTimeout(this.onReady.bind(this), 1000)}
,превратился в ЁНХ'ню. Не забывайте, что ООП -- это, в том числе и о совместном использовании.
Далее. Ваш суперкласс Machine, выглядит как масло маслянное. Вы могли бы сеттить состояние напрямую в объектах, едва ли стоило ради этого использовать отдельные методы, это тоже усложнение на пустом месте. Кроме того, не забывайте, что сеттите Вы синхронно, а таймер у вас асинхронный, это тоже, может обернуться внезапным WTF'ом, если Вы недостаточно четко понимаете, почему Вы это делаете, и когда. Кроме того, сама абстракция отдает маразмом, отключенная кофеварка после цикла приготовления внезапно обнаруживает, что она все это время была выключена, это что то из серии "назад в будущее". Как то так.
ЗЫ не сочтите за попытку Вас обидеть чем-то, я честное слово не хотел этого, просто (надеюсь) конструктивная критика, которая (надеюсь) пойдет на пользу