Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.07.2015, 15:31
Аспирант
Отправить личное сообщение для Moloch Посмотреть профиль Найти все сообщения от Moloch
 
Регистрация: 29.10.2013
Сообщений: 94

наследование в 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 все прекрасно читается
Ответить с цитированием
  #2 (permalink)  
Старый 21.07.2015, 15:40
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

вы хоть ссылки прикладываете, откуда это берете
setTimeout(onReady.bind(this), 1000);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 21.07.2015, 16:39
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Moloch, чем читал то, там про это написано?
Ответить с цитированием
  #4 (permalink)  
Старый 21.07.2015, 16:54
Аспирант
Отправить личное сообщение для Moloch Посмотреть профиль Найти все сообщения от Moloch
 
Регистрация: 29.10.2013
Сообщений: 94

спасибо, за ответы. разобрался
Ответить с цитированием
  #5 (permalink)  
Старый 22.07.2015, 05:02
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Кроме того там правильно написано: отнаследование. К унаследованию такие выкрутасы мало имеют отношения.
Ответить с цитированием
  #6 (permalink)  
Старый 22.07.2015, 05:09
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

А вообще да, бред. Включение и выключение - это события, которые само собой требуется запрограммировать. Между тем эта кофеварка включается тупо сразу как только падает с конвейера в ящик - coffeeMachine.run(); Вы где такое видели?
Ответить с цитированием
  #7 (permalink)  
Старый 22.07.2015, 11:50
Аспирант
Посмотреть профиль Найти все сообщения от tysonfury2015
 
Регистрация: 22.07.2015
Сообщений: 68

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

ЗЫ не сочтите за попытку Вас обидеть чем-то, я честное слово не хотел этого, просто (надеюсь) конструктивная критика, которая (надеюсь) пойдет на пользу

Последний раз редактировалось tysonfury2015, 22.07.2015 в 11:52.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
наследование в javascript mat5978 Общие вопросы Javascript 18 23.11.2011 16:17
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34