在jQueryUI中,Widget factory可用于扩展现有小部件的功能。例如,这对于调整私有方法(例如_renderItem
)很有用。
$.widget( "ui.autocomplete", $.ui.autocomplete, {
_renderItem: function( ul, item ) {
}
});
另一种方法(AFAIK给出类似的结果)是使用jQuery.extend()方法:
$.extend( $.ui.autocomplete, {
_renderItem: function( ul, item ) {
},
});
jQueryUI实现似乎在某些地方同时使用(第3335行,或在js文件中搜索“实时区域扩展”)
我的问题是:这两种扩展窗口小部件的方式之间有什么区别,作为一种好的做法,我应该更好地使用哪一种?
最佳答案
照常使用$.extend
无效,因为您直接将方法添加到构造函数中,因此需要将这些方法添加到构造函数的原型中或直接在实例上。
但是,以下方法将起作用:
$.extend($.ui.autocomplete.prototype, {
foo: true
});
这将使原始的自动完成类发生变化,因此,在扩展之前实例化的任何实例的副作用也将发生变化,即
var instance = $('input').autocomplete().data('uiAutocomplete');
console.log(instance.foo); // undefined
$.extend($.ui.autocomplete.prototype, { foo: true });
console.log(instance.foo); // true
另一方面,小部件工厂将创建一个新的“类”,该类从现有的
$.ui.autocomplete
继承(恰好会覆盖对原始自动完成构造函数的引用):var instance = $('input').autocomplete().data('uiAutocomplete');
console.log(instance.foo); // undefined
$.widget('ui.autocomplete', $.ui.autocomplete, { foo: true });
console.log(instance.foo); // undefined (still)
小部件工厂还允许您将构造函数存储在单独的命名空间中,以便可以同时使用原始构造函数和扩展构造函数:
$.widget('foo.autocomplete', $.ui.autocomplete, { foo: true });
console.log($.foo.autocomplete !== $.ui.autocomplete); // true
您将需要手动将原始构造函数重新桥接到jQuery插件,以便能够以“ jQuery方式”实例化它:
$.widget.bridge('originalAutocomplete', $.ui.autocomplete);
$('input').autocomplete(); // instanceof $.foo.autocomplete && instanceof $.ui.autocomplete
$('input').originalAutocomplete(); // instance of $.ui.autocomplete only
简而言之,与
$.widget
相比,$.extend
通常被推荐为最佳实践,但这取决于您的用例。