Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   наследование в javascript (https://javascript.ru/forum/dom-window/57138-nasledovanie-v-javascript.html)

Moloch 21.07.2015 15:31

наследование в 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 все прекрасно читается

nerv_ 21.07.2015 15:40

вы хоть ссылки прикладываете, откуда это берете
setTimeout(onReady.bind(this), 1000);

Moloch 21.07.2015 16:54

спасибо, за ответы. разобрался

kostyanet 22.07.2015 05:02

Кроме того там правильно написано: отнаследование. К унаследованию такие выкрутасы мало имеют отношения.

kostyanet 22.07.2015 05:09

А вообще да, бред. Включение и выключение - это события, которые само собой требуется запрограммировать. Между тем эта кофеварка включается тупо сразу как только падает с конвейера в ящик - coffeeMachine.run(); Вы где такое видели?

tysonfury2015 22.07.2015 11:50

По поводу Вашего вопроса Вам уже подсказали, дело в неверном связывании. Позволю себе ремарку. Ваш код, это яркий пример того, как не следует писать/проектировать. Вместо того, чтобы обобщить поведение, Вы размазали его по экземплярам, безо всякой на то надобности. В результате, элементарный, по сути код:
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, время: 20:41.