наследование в javascript
Здравствуйте. такой вопрос: почему из скрытого метода потомка нельзя получить доступ к свойству родителя?
<script>
function Machine(power) {
this._enabled = false;
this.enable = function() {
this._enabled = true;
};
this.disable = function() {
this._enabled = false;
};
}
function CoffeeMachine(power) {
Machine.apply(this, arguments);
var waterAmount = 0;
this.setWaterAmount = function(amount) {
waterAmount = amount;
};
function onReady() {
console.log(this._enabled);
if(this._enabled==false){
console.log('ошибка, кофеварка выключена!'+'enable: '+this._enabled);
}
else if(this._enabled==true){
console.log('Кофе готово!'+'enable: '+this._enabled);
}
}
this.run = function() {
console.log(this._enabled);
setTimeout(onReady, 1000);
};
}
var coffeeMachine = new CoffeeMachine(10000);
// coffeeMachine.enable();
coffeeMachine.run();
</script>
через метод onReady нельзя прочитать свойство enabled (выводит undefined) а через метод Run все прекрасно читается |
|
спасибо, за ответы. разобрался
|
Кроме того там правильно написано: отнаследование. К унаследованию такие выкрутасы мало имеют отношения.
|
А вообще да, бред. Включение и выключение - это события, которые само собой требуется запрограммировать. Между тем эта кофеварка включается тупо сразу как только падает с конвейера в ящик - coffeeMachine.run(); Вы где такое видели?
|
По поводу Вашего вопроса Вам уже подсказали, дело в неверном связывании. Позволю себе ремарку. Ваш код, это яркий пример того, как не следует писать/проектировать. Вместо того, чтобы обобщить поведение, Вы размазали его по экземплярам, безо всякой на то надобности. В результате, элементарный, по сути код:
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'ом, если Вы недостаточно четко понимаете, почему Вы это делаете, и когда. Кроме того, сама абстракция отдает маразмом, отключенная кофеварка после цикла приготовления внезапно обнаруживает, что она все это время была выключена, это что то из серии "назад в будущее". Как то так. ЗЫ не сочтите за попытку Вас обидеть чем-то, я честное слово не хотел этого, просто (надеюсь) конструктивная критика, которая (надеюсь) пойдет на пользу:) |
| Часовой пояс GMT +3, время: 11:25. |