Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замыкания, наследование и переопределение метода 
:(
    Опции темы
BobiKK
Дата 19.3.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Пытаюсь копнуть в JS немного глубже. И возникают проблемы. Суть такова.

Имеется базовый класс, PageController:
Код

var PageController = (function(){

    // статическая переменная, private. Доступна только привилигерованным методам
    var _current_view;
    
    // конструктор
    return function(request, new_view) {
        // private
        var _that = this;
        var _view = new_view;
        
        // Привилигерованный метод. Имеет доступ к private переменной
        this.getThat = function() {
            return _that;
        }
        
        this.postDispatch = function() {
            _current_view = _view;
            document.getElementById(_current_view).style.display = 'block';
        }
        
        this.execute = function() {
            alert("PageController::execute");
        }
        
    }
})();


Есть класс наследник PageController'а, а именно StartController:
Код

var StartController = function(request){
    // Вызываем констуктор предка, т.е. конструктор PageController'а
    StartController.superclass.constructor.call(this, request, 'start-view');
    
    // Переписываем метод предка
    this.execute = function() {
        alert('StartController::execute');
    }
    
    // Переписываем метод предка
    this.postDispatch = function() {
        // Пытаемся получить ссылку на предка, но не получается. that == this
        var that = this.getThat();
        alert(that);
    }
}

//  Собственное, наследуем 
extend(StartController, PageController);


Наследование выполняется функцией:
Код

function extend(subClass, superClass){
    var F = function(){
    };
    F.prototype = superClass.prototype;
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;
    subClass.superclass = superClass.prototype;
    
    if (superClass.prototype.constructor == Object.prototype.constructor) {
        superClass.prototype.constructor = superClass;
    }
}


Задача: в StartController'е переписать метод postDispatch(), при этом иметь возможность вызвать PageController::postDispatch(), т.е. метод предка.
Хоть убейте, не догоняю, как это реализовать. И поэтому прошу помощи

Это сообщение отредактировал(а) BobiKK - 19.3.2010, 12:36
PM MAIL   Вверх
ksnk
Дата 19.3.2010, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



набла 40
P.S. в тексте дофига ошибок.
superclass в StartController неопределен и протч...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
BobiKK
Дата 19.3.2010, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Цитата(ksnk @  19.3.2010,  01:06 Найти цитируемый пост)
набла 40
P.S. в тексте дофига ошибок.
superclass в StartController неопределен и протч... 

Ошибки в тексте - уж извиняйте, после стольких часов подряд вникания в JS мозг отказывается замечать опечатки.

superclass определен, функия extend этим занимается
PM MAIL   Вверх
Michael.de
Дата 19.3.2010, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 4
Всего: 9



Цитата(BobiKK @  19.3.2010,  01:22 Найти цитируемый пост)
...Ошибки в тексте - уж извиняйте, после стольких часов подряд вникания в JS мозг отказывается замечать опечатки...
А для этого существуют среды разработки JavaScript, например NetBeans или Aptana  smile

Это сообщение отредактировал(а) Michael.de - 19.3.2010, 03:19
PM MAIL   Вверх
BobiKK
Дата 19.3.2010, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: нет
Всего: 16



Цитата(Michael.de @  19.3.2010,  03:18 Найти цитируемый пост)
Цитата(BobiKK @  19.3.2010,  01:22 Найти цитируемый пост)
...Ошибки в тексте - уж извиняйте, после стольких часов подряд вникания в JS мозг отказывается замечать опечатки...
А для этого существуют среды разработки JavaScript, например NetBeans или Aptana  smile

В тексте чего? JS? Скрипт полностью рабочий за иключением одного момента, он указан и в комментариях, и в самом вопросе.
Речь об ИДЕ вроде как не идет. У меня проблема не в синтаксисе, а в логике.

@ksnk: Собственно, я делаю тоже самое что и в набле. Принципиальных различий нет. Только видимо из-за того, что базовый класс реализован в виде замыкания, не получается вызвать его остальные методы кроме конструктора.
Код

// В StartController
this.postDispatch = function() {
        alert(StartController.superclass.constructor);  // function (request, new_view) {
                                                        //     var _view = new_view;
                                                        //     var _that = this;
                                                        //     this.getThat = function () {return _that;};
                                                        //     this.postDispatch = function () {_current_view =      ....
                                                        //     }
         alert(StartController.superclass.constructor.postDispatch);   // undefined
    }


Это сообщение отредактировал(а) BobiKK - 19.3.2010, 13:32
PM MAIL   Вверх
ksnk
Дата 19.3.2010, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



F.prototype = superClass.prototype;
заменить на 
F.prototype = superClass;

поможет?

Добавлено через 33 секунды
в функции Extend 



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.