使用$.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 相比,更常被推荐为最佳实践,但这取决于您的用例。