Показать сообщение отдельно
  #1 (permalink)  
Старый 20.03.2010, 20:51
Новичок на форуме
Отправить личное сообщение для BobiKK Посмотреть профиль Найти все сообщения от BobiKK
 
Регистрация: 20.03.2010
Сообщений: 3

Наследование класса-замыкания и вызов метода предка
Господа, пытаюсь разобраться в программирование на 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


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