Ответ 1
Если вам нужны только те методы addProduct
и deleteProduct
для этого единственного объекта jQuery, то то, что у вас есть, будет работать нормально; но вам нужно будет ссылаться на этот объект jQuery/использовать его один раз, чтобы сохранить существование методов addProduct
и deleteProduct
.
Однако эти методы addProduct
и deleteProduct
уникальны для этого конкретного объекта jQuery; методы не будут существовать ни на одном другом объекте jQuery, который вы создаете;
var productList = $.extend($('ul.products'), {
addProduct: function(productData) {
// add a new li item
},
deleteProduct: function(productId) {
// delete li with id
}
});
// Using this particular jQuery object (productList) will work fine.
productList.addProduct();
productList.removeProduct();
// However, addProduct() does not exist on new jQuery objects, even if they use
// the same selector.
$('ul.products').addProduct(); // error; [object Object] has no method 'addProduct'
Лучший способ сделать это - вернуться к основам и определить отдельные функции addProduct
и deleteProduct
, которые принимают объект jQuery. Если вы хотите ограничить эти функции, они работают только с селектором ul.products
, вы можете сделать:
function addProduct(obj) {
obj = obj.filter('ul.products');
// do something with `obj` (its a jQuery object)
}
Этот подход будет рекомендован, поскольку он поддерживает API jQuery.fn
; в противном случае вы добавляете addProduct
и removeProduct
к некоторым экземплярам jQuery.fn
, а не к другим, или делаете их использование избыточным в других. Однако при таком подходе addProduct
и removeProduct
всегда присутствуют, но не попадают никоим образом, если они не хотят их использовать.
Исторические заметки
Этот ответ был изначально написан в ноябре 2011 года, когда был выпущен jQuery 1.7. С тех пор API значительно изменился. Ответ выше относится к текущей версии 2.0.0 версии jQuery.
До 1.9 использовался мало используемый метод под названием jQuery.sub
, который связан с тем, что вы пытаетесь сделать ( но не поможет вам, если вы не измените свой подход). Это создает новый конструктор jQuery, поэтому вы можете сделать;
var newjQuery = jQuery.sub();
newjQuery.fn.addProduct = function () {
// blah blah
};
newjQuery.fn.deleteProduct = function () {
// blah blah
};
var foo = newjQuery('ul.products');
foo.deleteProduct();
foo.addProduct();
var bar = jQuery('ul.products');
bar.deleteProduct(); // error
bar.addProduct(); // error
Будьте осторожны, хотя псевдоним метода $
ссылался бы на старый объект jQuery
, а не на экземпляр newjQuery
.
jQuery.sub
был удален из jQuery в 1.9. Теперь он доступен как плагин.