При первом знакомстве с jQuery, после долгих отношений с mootools, впечатление было неоднозначное. Больше всего раздражали классы. Точнее, отсутствие в jQuery классов, наследования, и всего такого.
- Как? - спрашиваю я - Совсем нет?.
- Совсем нет - отвечали коллеги.
А доки по jquery вообще деликатно промолчали на эту тему, упорно упоминая слово class только рядом с CSS.
Но, как известно, если долго мучаться, что нибудь получится.
Вариант 1 - плагин
Можно использовать плагин от John Resig (один из разработчиков библиотеки jQuery) под названием Classy Query . Пример использования с его сайта:
var Person = jQuery.Class.create({
init: function(name){
this.name = name;
}
});
var ClassyDude = Person.extend({
sipWine: function(){
return "Has a beautiful bouquet.";
}
});
Говорят помогает, но мне к сожалению он попался на глаза совсем недавно. Так что пока довелось пользоваться только велосипедом, который опишу в пункте 2.
Вариант 2 - мой велосипед
Значит так, думаю я: что мне собственно нужно от классов? Чтобы функции, однажды написанные в предке появлялись и у потомков. Но ведь в js функции могут появляться и после инициализации js-объекта. Надо просто передать объект-псевдо-потомок в объект-псевдо-предок. И пусть предок допишет потомку, то чего ему не хватает. Например так:
var projectAjaxForm = new Object({
init: function(_child) {
_child.validator = _child.form.validate();
_child.form.ajaxForm({
dataType: 'json',
beforeSubmit: function(){return _child.validate()},
success: function(json) {
_child.submit_cb(json);
}
});
if( !(_child.submit_cb) ) {
_child.submit_cb = function(json){
// что то тут делаем...
};
}
if( !(_child.validate) ) {
_child.validate = function() {
return this.validator.form();
};
}
/* допилить напильником */
}
});
а как бы наследоваться так:
var myForm = new Object({
init: function(){
this.form = $("#my-form");
projectAjaxForm.init(this);
}
});
Конечно, это не идеал, но мне на текущем проекте работу упрощает.
В мыслях на будущее:
- Сделать, чтоб функции могли не переопределяться полностью, а дополняться. Это довольно актуально.
- Сделать аналог статических переменных. Это скорее для красоты, т.к. сейчас можно просто юзать глобальные объекты или переменные.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.