Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Переопределение метода базового класса (https://javascript.ru/forum/jquery/4336-pereopredelenie-metoda-bazovogo-klassa.html)

walash 13.07.2009 03:03

Переопределение метода базового класса
 
Доброго времени суток.

Суть задачи: есть некий класс, нужно сделать так, чтобы вызвался его метод(приватный) и выполнились мои дополнительные действия.

Конкретно: Есть jquery datepicker, у него есть метод _generateHTML, нужно сделать так, чтобы он вызывался и делал все что он делает, плюс еще дополнительные действия.

А вообще задача состоит в том чтобы динамически изменять Html datepicker'a, а проблема в том, что он постоянно его перегенерирует и я не знаю, куда привязать мои действия по изменению html.

(ах да, редактировать файл с кодом самого DatePicker'a нельзя)

полезные ссылки: http://jquery-ui.googlecode.com/svn/....datepicker.js

walash 13.07.2009 14:05

up

Dmitry A. Soshnikov 13.07.2009 14:29

walash, вы топик только сегодня создали, не нужно апать его так быстро/часто.

Сами уже что-то попробовали сделать? А то Ваш топик звучит как задание, а не просьба помочь. Для заданий, есть соответствующий раздел.

e1f 13.07.2009 14:34

Так сделать-то можно, но это гадко и подло :) То есть примерно так:
$.datepicker.constructor.prototype._generateHTML = function(){
  // do something ...
}
$.datepicker = new $.datepicker.constructor()

Но все же, может быть, можно без этого обойтись, решив проблему как-то иначе?

walash 13.07.2009 15:26

e1f, ты почти оветил на мой вопрос!! :dance:

еще последний шаг и проблема будет решена

$.datepicker.constructor.prototype._generateHTML = function(){

$.datepicker._generateHTML(inst); // не знаю как в этом месте вызвать этот метод, чтобы выполнился для текущего состояния объекта
DoSomeExtraActions();
}
$.datepicker = new $.datepicker.constructor();

P.S. to Dmitry A. Soshnikov: сори за напористость )

walash 13.07.2009 15:34

К тому же если так написать получается рекурсия :cray:

e1f 13.07.2009 16:30

Конечно, так получается рекурсия. Надо выдрать код старого метода, поместить в новый, и переделать (ну или дописать в конце свое, родное)

walash 13.07.2009 17:46

Спасибо большое за советы

x-yuri 14.07.2009 07:40

мб лучше так?
var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML;
$.datepicker.constructor.prototype._generateHTML = function(){
    oldGenerateHTML.apply(this, arguments); 
    ...
}

e1f 14.07.2009 12:48

Да, так действительно лучше :) Но тут маленькое но -- $.datepicker.constructor.prototype._generateHTML не существует

walash 14.07.2009 13:15

Не знаю, у меня прокатило и работает ;)
function ExtendFunctionality() {
        $.datepicker.constructor.prototype._updateDatepicker = function(inst) {
            
            // code from date picker

            ModifyDatePicker(); // OUR CHANGES
        }
    }


с _generateHTML тоже пробовал и тоже работает

walash 14.07.2009 13:21

персанальное спасибо x-yuri за:

var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML;
$.datepicker.constructor.prototype._generateHTML = function(){
    oldGenerateHTML.apply(this, arguments); 
    ...
}


50 строк гавнокода долой !

x-yuri 14.07.2009 14:20

Цитата:

Сообщение от e1f
Но тут маленькое но -- $.datepicker.constructor.prototype._generateHTML не существует

почему? Это фактически Datepicker.prototype._generateHTML, только без использования названия внутреннего класса

walash 14.07.2009 14:25

Поспешил радоваться, почти все методы datepicker'a имеют ссылки this, который адресуюстя на инстанс datepicker'a, а когда мы пишем так:

var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML;


то он в this разпазнает как window, а не $.datepicker

А когда код вбиваешь туда текстом, то почему то все ок

e1f 14.07.2009 14:34

x-yuri,
Да, все верно. Я смотрел у себя какую-то не ту версию Datepickera :)

x-yuri 14.07.2009 14:50

Цитата:

Сообщение от walash
то он в this разпазнает как window, а не $.datepicker

кто и где?

walash 14.07.2009 19:09

function ExtendFunctionality() {
        $.datepicker.constructor.prototype._updateDatepicker = function(inst) {
 
            // когда здесь пишется this, тогда он воспринимается как $.datepicker
 
            ModifyDatePicker(); // OUR CHANGES
        }
    }


при данном раскладе, this рассматривается как window и идет прямиком в код datepicker'a:
function ExtendFunctionality() {

            var oldUpdateDatepicker = $.datepicker.constructor.prototype._updateDatepicker;
            $.datepicker.constructor.prototype._updateDatepicker = function(inst) {
                oldUpdateDatepicker(inst);  //   когда начинает выполнятся код отсюда, то this это уже window
                ModifyDatePicker(); // OUR CHANGES                
            }
        }


Вот что валяется в _updateDatepicker:
/* Generate the date picker content. */
	_updateDatepicker: function(inst) {
		var dims = {width: inst.dpDiv.width() + 4,
			height: inst.dpDiv.height() + 4};
		var self = this;
		inst.dpDiv.empty().append(this._generateHTML(inst))   // первое место, где this уже не тот
			.find('iframe.ui-datepicker-cover').
				css({width: dims.width, height: dims.height})
			.end() . . .  // и т.д. и т.п.
. . . . . . . ..  .. .. . . .. .  .
. . . . . .. . .. . . . .. .
	
	}

e1f 14.07.2009 19:33

walash, Вам же x-yuri писал как надо:
вместо
oldUpdateDatepicker(inst)
используйте
oldGenerateHTML.apply(this, arguments)

walash 15.07.2009 17:05

Ребята, я вас люблю


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