Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   перегрузка функций jquery (https://javascript.ru/forum/jquery/37766-peregruzka-funkcijj-jquery.html)

challenger 06.05.2013 13:11

перегрузка функций jquery
 
добрый день!
не подскажете возможно ли сделать следующее ?

есть <input id="test1" value="val1">
$('#test1').val() возвращает "val1" .

возможно ли сделать следующее?
"перегрузить" метод val() для объекта $('#test1').

чтобы $('#test1').val() возвращал другое значение. но при этом атрибут value был равен "val1".


$('#test1').val = function(){
return "val2" ;
}
пробовал так, но к сожалению, не сработало.
console.log($('#test1').val()) ; /// логирует val1, т.е. текущее значение.
что я делаю не так? и вообще возможно ли это?


заранее спасибо.

Octane 06.05.2013 13:39

Выполняя $('#test1'), вы каждый раз создаете новый экземпляр объекта jQuery. Если упростить код библиотеки, то происходит примерно следующее:
function jQuery(arg) {
	var list = document.querySelectorAll(arg), i = list.length;
	while (i--) {
		this[i] = list[i];
	}
}

function $(arg) {
	return new jQuery(arg);
}

чтобы изменить метод val для всех объектов jQuery, необходимо внести изменения в прототип:
jQuery.prorotype.val = function () {
	return "val2";
};

чтобы изменить метод val конкретного экземпляра jQuery, необходимо сохранить на него ссылку, и работать с ним по этой ссылке:
var $test = $('#test1');
$test.val = function () {
	return "val2";
};
alert($test.val());

challenger 06.05.2013 14:21

огромное спасибо за разъяснения.
всё работает.

monolithed 07.05.2013 18:33

Цитата:

Сообщение от Octane
чтобы изменить метод val для всех объектов jQuery, необходимо внести изменения в прототип:
jQuery.prorotype.val = function () {
    return "val2";
};

jQuery.prototype.val :)

challenger,
В следующий раз создавайте тему в соответсвующем разделе!

animhotep 07.05.2013 18:44

да, и jQuery.prototype.val === $.fn.val
write less, do more))


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