Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.03.2010, 19: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


Извиняюсь, если вопрос слишком примитивный, но никак не получается разобраться.
Ответить с цитированием
  #2 (permalink)  
Старый 21.03.2010, 07:27
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

postDispatch не содержится в prototype родителя и добавляется к экземпляру лишь при его создании, т. е. без создания экземпляра родительского класса доступа к этому методу не получить. Учитесь использовать свойство prototype конструктора.
Ответить с цитированием
  #3 (permalink)  
Старый 21.03.2010, 12:26
Новичок на форуме
Отправить личное сообщение для BobiKK Посмотреть профиль Найти все сообщения от BobiKK
 
Регистрация: 20.03.2010
Сообщений: 3

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

Последний раз редактировалось BobiKK, 21.03.2010 в 13:59.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как внутри класса вызвать метод из соседнего метода Shahurik Общие вопросы Javascript 2 13.11.2009 11:20
Переопределение метода базового класса walash jQuery 18 15.07.2009 16:05
AJAX, вызов из метода обьекта Logo Общие вопросы Javascript 4 20.06.2009 22:35
вызов метода return для функции-родителя evgen28 Общие вопросы Javascript 17 22.01.2009 14:46