Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Замыкания, наследование и переопределение метода


Автор: BobiKK 19.3.2010, 00:06
Пытаюсь копнуть в 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(), т.е. метод предка.
Хоть убейте, не догоняю, как это реализовать. И поэтому прошу помощи

Автор: ksnk 19.3.2010, 01:06
http://dklab.ru/chicken/nablas/40.html
P.S. в тексте дофига ошибок.
superclass в StartController неопределен и протч...

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

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

superclass определен, функия extend этим занимается

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

Автор: BobiKK 19.3.2010, 13:30
Цитата(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
    }

Автор: ksnk 19.3.2010, 16:19
F.prototype = superClass.prototype;
заменить на 
F.prototype = superClass;

поможет?

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)