如果你只想要addProduct
and deleteProduct
方法来突出这一点singlejQuery 对象,那么你所拥有的就可以正常工作;但是你必须保留对该 jQuery 对象的引用/只使用它一次,以保留该对象的存在addProduct
and deleteProduct
方法。
然而,这些addProduct
and 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
and deleteProduct
函数,它接受 jQuery 对象。如果您想将这些功能限制为仅适用于ul.products
选择器,你可以这样做;
function addProduct(obj) {
obj = obj.filter('ul.products');
// do something with `obj` (its a jQuery object)
}
建议采用这种方法,因为它可以保持jQuery.fn
API一致;否则你会添加addProduct
and removeProduct
to some jQuery.fn
实例而不是其他实例,或者使它们的使用在其他实例中变得多余。然而采用这种方法addProduct
and removeProduct
总是在那里,但如果他们不想使用它们,请不要妨碍任何人。
历史笔记
这个答案最初写于 2011 年 11 月,当时 jQuery 1.7 发布。从那时起,API 发生了很大变化。上面的答案与currentjQuery 2.0.0 版本。
在1.9之前,有一个很少使用的方法叫做jQuery.sub http://api.jquery.com/jQuery.sub/曾经存在过,即related到你想要做的事情(但不会帮助你,除非你改变你的方法)。这会创建一个新的 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
在 1.9 中已从 jQuery 中删除。现在可以使用了作为插件 http://jquery.com/upgrade-guide/1.9/.