Наследование класса-замыкания и вызов метода предка
Господа, пытаюсь разобраться в программирование на 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 Извиняюсь, если вопрос слишком примитивный, но никак не получается разобраться. |
postDispatch не содержится в prototype родителя и добавляется к экземпляру лишь при его создании, т. е. без создания экземпляра родительского класса доступа к этому методу не получить. Учитесь использовать свойство prototype конструктора.
|
Да-да, это всё верно и понятно почему нету прямого доступа к методам предка. Я просто думал, что может быть есть какой-то другой способ отличный от инстанцирования предка или переписывания предка без использования замыкания, т.е. сохраняя принцип инкапсуляции
|
Часовой пояс GMT +3, время: 00:57. |