Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Наследование класса-замыкания и вызов метода предка (https://javascript.ru/forum/misc/8348-nasledovanie-klassa-zamykaniya-i-vyzov-metoda-predka.html)

BobiKK 20.03.2010 20:51

Наследование класса-замыкания и вызов метода предка
 
Господа, пытаюсь разобраться в программирование на JavaScript и возникают проблемы.

Имеется класс PageController, который реализован в виде замыкания, чтобы эмулировать создание private static переменных.
var PageController = (function(){

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


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

//  Собственное, наследуем 
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;
    }
}


Вызывается всё это дело из друго класса:
var controller = new StartController('blabla');
controller.execute(); // выдает StartController::execute(), т.е. метод переопределился, всё гут
controller.postDispatch();


Собственно, вопрос. Каким образом из StartController:: postDispatch() вызвать PageController:: postDispatch()?
this.postDispatch = function() {
        alert(StartController.superclass.constructor);  // function (request, new_view) {
                                                        //     var _view = new_view;
                                                        //     this.execute = function( { alert("PageController::execute");}
                                                        //     this.postDispatch = function () {_current_view =      ....
                                                        //     }
         alert(StartController.superclass.constructor.postDispatch);   // undefined


Извиняюсь, если вопрос слишком примитивный, но никак не получается разобраться.

Riim 21.03.2010 08:27

postDispatch не содержится в prototype родителя и добавляется к экземпляру лишь при его создании, т. е. без создания экземпляра родительского класса доступа к этому методу не получить. Учитесь использовать свойство prototype конструктора.

BobiKK 21.03.2010 13:26

Да-да, это всё верно и понятно почему нету прямого доступа к методам предка. Я просто думал, что может быть есть какой-то другой способ отличный от инстанцирования предка или переписывания предка без использования замыкания, т.е. сохраняя принцип инкапсуляции


Часовой пояс GMT +3, время: 22:10.